tutorial lenguaje instalar descargar python

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() .



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