2009-05-14 16 views
22

Je voudrais pouvoir faire ce qui suit:Comment puis-je effectuer divison sur un datetime.timedelta en python?

num_intervals = (cur_date - previous_date)/interval_length 

ou

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

mais l'opération de division est non pris en charge sur timedeltas. Existe-t-il un moyen de mettre en place une division pour les timedeltas?

Edit: (merci! Rincewind) On dirait que cela a été ajouté à Python 3.2: http://bugs.python.org/issue2706

+2

division timedelta est mis en œuvre en Python 3.2 – rincewind

Répondre

10

Bien sûr, juste convertir un certain nombre de secondes (minutes, millisecondes, heures, faites votre choix d'unités) et fais la division.

EDIT (à nouveau): vous ne pouvez donc pas attribuer à timedelta.__div__. Essayez ceci, alors:

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 

Et pour l'intégrer dans la suggestion de nadia:

class MyTimeDelta: 
    __div__ = divtd 

Exemple d'utilisation:

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

etc. Bien sûr, vous pourriez même nom (ou pseudonyme) votre La classe personnalisée timedelta est donc utilisée à la place du vrai timedelta, au moins dans votre code.

3

Vous pouvez remplacer l'opérateur de division comme ceci:

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

division et multiplication par des entiers semble fonctionner out of the box:

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

Il fonctionne également en Python 2 – sth