2009-05-14 20 views
22

Tôi muốn để có thể làm như sau:Làm cách nào để thực hiện divison trên datetime.timedelta trong python?

num_intervals = (cur_date - previous_date)/interval_length 

hoặc

print (datetime.now() - (datetime.now() - timedelta(days=5))) 
    /timedelta(hours=12) 
# won't run, would like it to print '10' 

nhưng các hoạt động bộ phận không được hỗ trợ trên timedeltas. Có cách nào mà tôi có thể thực hiện divison cho timedeltas?

Edit: (! Nhờ rincewind) Trông như thế này đã được thêm vào Python 3.2: http://bugs.python.org/issue2706

+2

phận timedelta được thực hiện trong Python 3.2 – rincewind

Trả lời

10

Chắc chắn, chỉ cần chuyển đổi sang một số giây (phút, mili giây, giờ, đưa đón bạn của đơn vị) và làm bộ phận.

EDIT (lại): vì vậy bạn không thể chỉ định cho timedelta.__div__. Hãy thử điều này, thì:

divtdi = datetime.timedelta.__div__ 
def divtd(td1, td2): 
    if isinstance(td2, (int, long)): 
     return divtdi(td1, td2) 
    us1 = td1.microseconds + 1000000 * (td1.seconds + 86400 * td1.days) 
    us2 = td2.microseconds + 1000000 * (td2.seconds + 86400 * td2.days) 
    return us1/us2 # this does integer division, use float(us1)/us2 for fp division 

Và để kết hợp này vào gợi ý nadia của:

class MyTimeDelta: 
    __div__ = divtd 

Ví dụ sử dụng:

>>> divtd(datetime.timedelta(hours = 12), datetime.timedelta(hours = 2)) 
6 
>>> divtd(datetime.timedelta(hours = 12), 2) 
datetime.timedelta(0, 21600) 
>>> MyTimeDelta(hours = 12)/MyTimeDelta(hours = 2) 
6 

vv Tất nhiên bạn có thể thậm chí tên (hoặc bí danh) của bạn tùy chỉnh lớp timedelta vì vậy nó được sử dụng thay cho timedelta thực, ít nhất là trong mã của bạn.

3

Bạn có thể ghi đè lên các nhà điều hành bộ phận như thế này:

class MyTimeDelta(timedelta): 
    def __div__(self, value): 
      # Dome something about the object 
10

Division và nhân bởi số nguyên dường như làm việc out of the box:

>>> from datetime import timedelta 
>>> timedelta(hours=6) 
datetime.timedelta(0, 21600) 
>>> timedelta(hours=6)/2 
datetime.timedelta(0, 10800) 
+0

Nó cũng làm việc trong Python 2 – sth

Các vấn đề liên quan