¿Cómo puedo realizar una división en un datetime.timedelta en Python?
Pregunta
Me gustaría ser capaz de hacer lo siguiente:
num_intervals = (cur_date - previous_date) / interval_length
o
print (datetime.now() - (datetime.now() - timedelta(days=5)))
/ timedelta(hours=12)
# won't run, would like it to print '10'
pero la operación de división es no soportado en timedeltas. ¿Hay una manera que puedo poner en práctica División de timedeltas?
Editar Parece que esto se añadió a Python 3.2 (gracias rincewind!): http : //bugs.python.org/issue2706
Solución
Claro, sólo convertir en un número de segundos (minutos, milisegundos, horas, tomar su selección de unidades) y hacer la división.
editar (de nuevo): por lo que no se puede asignar a timedelta.__div__
. Prueba de esto, a continuación:
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
Y para incorporar esto en la sugerencia de Nadia:
class MyTimeDelta:
__div__ = divtd
Ejemplo de uso:
>>> 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. Por supuesto que podría incluso nombre (o seudónimo) la clase personalizada timedelta
por lo que se utiliza en lugar de la <=> real, al menos en su código.
Otros consejos
División y multiplicación por números enteros parece funcionar fuera de la caja :
>>> from datetime import timedelta
>>> timedelta(hours=6)
datetime.timedelta(0, 21600)
>>> timedelta(hours=6) / 2
datetime.timedelta(0, 10800)
Puede reemplazar el operador de división como esto:
class MyTimeDelta(timedelta):
def __div__(self, value):
# Dome something about the object