python - lenguaje - ¿Cómo convierto segundos a horas, minutos y segundos?
python tutorial (7)
Al usar la función divmod()
, que hace solo una división para producir tanto el cociente como el resto, puede obtener el resultado muy rápidamente con solo dos operaciones matemáticas:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
print "%d:%02d:%02d" % (h, m, s)
Tengo una función que devuelve información en segundos, pero necesito almacenar esa información en horas: minutos: segundos.
¿Hay una manera fácil de convertir los segundos a este formato en Python?
Así es como lo conseguí.
def sec2time(sec, n_msec=3):
'''''' Convert seconds to ''D days, HH:MM:SS.FFF'' ''''''
if hasattr(sec,''__len__''):
return [sec2time(s) for s in sec]
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if n_msec > 0:
pattern = ''%%02d:%%02d:%%0%d.%df'' % (n_msec+3, n_msec)
else:
pattern = r''%02d:%02d:%02d''
if d == 0:
return pattern % (h, m, s)
return (''%d days, '' + pattern) % (d, h, m, s)
Algunos ejemplos:
$ sec2time(10, 3)
Out: ''00:00:10.000''
$ sec2time(1234567.8910, 0)
Out: ''14 days, 06:56:07''
$ sec2time(1234567.8910, 4)
Out: ''14 days, 06:56:07.8910''
$ sec2time([12, 345678.9], 3)
Out: [''00:00:12.000'', ''4 days, 00:01:18.900'']
Difícilmente puedo nombrarlo de una manera fácil (al menos no puedo recordar la sintaxis), pero es posible usar time.strftime , que da más control sobre el formateo:
>>> import time
>>> time.strftime("%H:%M:%S", time.gmtime(666))
''00:11:06''
gmtime se usa para convertir segundos a un formato de tupla especial que requiere strftime()
.
Este es mi truco rápido:
import humanfriendly
humanfriendly.format_timespan(secondsPassed)
visite: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan para obtener más información.
O puedes hacer:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
''0:11:06''
Si necesita obtener el valor de datetime.time
, puede utilizar este truco:
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
No puede agregar timedelta
a time
, pero puede agregarlo a datetime
.
UPD : Otra variación de la misma técnica:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
En lugar de 1
, puede usar cualquier número mayor que 0. Aquí usamos el hecho de que datetime.fromordinal
siempre devolverá el objeto datetime
con el componente de time
cero.
>>> import datetime
>>> "{:0>8}".format(datetime.timedelta(seconds=66))
>>> "{:0>8}".format(str(datetime.timedelta(seconds=66))) # Python3
>>> ''00:01:06'' # good
y:
>>> "{:0>8}".format(datetime.timedelta(seconds=666777))
>>> "{:0>8}".format(str(datetime.timedelta(seconds=666777))) # Python3
>>> ''7 days, 17:12:57'' # nice
sin '': 0> 8'':
>>> "{}".format(datetime.timedelta(seconds=66))
>>> ''0:01:06'' # not HH:MM:SS
y:
>>> import time
>>> time.strftime("%H:%M:%S", time.gmtime(666777))
>>> ''17:12:57'' # wrong
pero:
>>> "{:0>8}".format(datetime.timedelta(seconds=620000))
>>> "{:0>8}".format(str(datetime.timedelta(seconds=620000))) # Python3
>>> ''7 days, 4:13:20'' # bummer