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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top