Entendiendo timedelta

90

Dado el código de Python a continuación, ayúdenme a comprender lo que está sucediendo allí.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Entonces, obtengo la diferencia entre start timey end time, en la línea 5, redondeo la duración mediante el casting y ahora, ¿cuál es la explicación adicional?

Sé lo que significa delta (promedio o diferencia), pero ¿por qué tengo que pasar seconds = uptimea timedeltay por qué la fundición de cuerdas funciona tan bien que obtengo HH:MM:SS?

Pablo
fuente

Respuestas:

114

Porque timedelta se define como:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Todos los argumentos son opcionales y el valor predeterminado es 0.

Puede decir fácilmente "Tres días y cuatro milisegundos" con argumentos opcionales de esa manera.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

Y para str casting, devuelve un buen valor formateado en lugar de __repr__mejorar la legibilidad. De los documentos:

str (t) Devuelve una cadena con el formato [D día [s],] [H] H: MM: SS [.UUUUUU], donde D es negativo para t negativo. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Documentación de pago:

http://docs.python.org/library/datetime.html#timedelta-objects

utdemir
fuente
13

¿Por qué tengo que pasar segundos = tiempo de actividad a timedelta?

Debido a que los objetos timedelta pueden pasar segundos, milisegundos, días, etc., por lo que debe especificar qué está pasando (es por eso que usa la clave explícita). Encasillar a intes superfluo, ya que también podrían aceptar flotadores.

y ¿por qué funciona tan bien la fundición de cuerdas que obtengo HH: MM: SS?

No es el encasillado lo que formatea, es el __str__método interno del objeto. De hecho, obtendrá el mismo resultado si escribe:

print datetime.timedelta(seconds=int(uptime))
Mac
fuente
1
Usted insinúa esto, pero vale la pena señalar explícitamente que timedelta hace mucho más que mostrar cosas en formato HH: MM: SS. Se utiliza un objeto timedelta siempre que necesite tomar una diferencia entre dos objetos de fecha y hora.
Wilduck
1
No es el __repr__método, es el __str__método.
utdemir
1
No el __repr__()de timedelta, sino su __str__()método. printllama __str()__por ti.
bgporter