¿Cómo convierto segundos a horas, minutos y segundos?

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?

Related of "¿Cómo convierto segundos a horas, minutos y segundos?"

Puedes usar la función datetime.timedelta :

 >>> import datetime >>> str(datetime.timedelta(seconds=666)) '0:11:06' 

Al usar la función divmod() , que hace solo una división para producir tanto el cociente como el rest, puede obtener el resultado muy rápidamente con solo dos operaciones matemáticas:

 m, s = divmod(seconds, 60) h, m = divmod(m, 60) 

Y luego use el formato de cadena para convertir el resultado en un resultado deseable:

 print "%d:%02d:%02d" % (h, m, s) print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3 

Difícilmente puedo nombrarlo de una manera fácil (al menos no puedo recordar la syntax), 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() .

 >>> 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 

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.

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.

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']