Entendiendo timedelta


Dado el código python a continuación, por favor ayúdame a entender 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)))

Así que obtengo la diferencia entre start time y end time, en la línea 5 redondeo la duración por 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 = uptime a timedelta y por qué el casting de cadenas funciona tan bien que obtengo HH:MM:SS?

Author: Paul, 2011-07-19

2 answers

Porque timedelta se define como:

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

Todos los argumentos son opcionales y por defecto 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__ para mejorar la legibilidad. De docs:

Str(t) Devuelve una cadena en la forma [D day[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'

Pago documentación:

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

 83
Author: utdemir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 20:47:26

¿Por qué tengo que pasar segundos = uptime a timedelta

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

¿Y por qué el casting de cuerdas funciona tan bien que obtengo HH:MM:SS ?

No es el encasillamiento lo que formatea, es el método interno __str__ del objeto. De hecho, lograrás el mismo resultado si escribes:

print datetime.timedelta(seconds=int(uptime))
 10
Author: mac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 15:14:00