2009-05-14 7 views
22

ja jak móc wykonać następujące czynności:Jak mogę wykonać divison na datetime.timedelta w python?

num_intervals = (cur_date - previous_date)/interval_length 

lub

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

ale operacja podział nie jest obsługiwana w timedeltas. Czy istnieje sposób, w jaki mogę wprowadzić divison dla timedeltas?

Edycja: (! Dzięki Rincewind) Wygląda na to, dodano do Pythona 3.2: http://bugs.python.org/issue2706

+2

timedelta podział jest realizowany w Pythonie 3.2 – rincewind

Odpowiedz

10

Jasne, po prostu przekonwertować na liczbę sekund (minut, milisekundy, godziny, wybrać odpowiednią opcję jednostek) i zrób podział.

EDYTUJ (ponownie): nie można przypisać do timedelta.__div__. Spróbuj tego, a następnie:

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 

I włączyć to do Nadii sugestia:

class MyTimeDelta: 
    __div__ = divtd 

Przykład wykorzystania:

>>> 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 

itd. Oczywiście można nawet nazwisko (lub pseudonim) Twój niestandardowa klasa timedelta, więc zostanie użyta zamiast prawdziwego timedelta, przynajmniej w twoim kodzie.

3

Można zastąpić operatora dzielenia takiego:

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

Division i mnożenie przez liczby całkowite wydaje się działać out of the box:

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

Działa również w Pythonie 2 – sth

Powiązane problemy