2009-04-21 65 views
298

Tengo una función que devuelve información en segundos, pero necesito almacenar esa información en horas: minutos: segundos.¿Cómo convertir los segundos a horas, minutos y segundos?

¿Hay una manera fácil de convertir los segundos a este formato en python?

+11

El inverso de este problema se puede encontrar en [Cómo convertir una cadena de tiempo H: MM: SS a segundos en Python?] (Http://stackoverflow.com/questions/6402812/how-to-convert-an -hmmss-time-string-to-seconds-in-python) – hughes

Respuesta

467

o puede hacer

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

Esta es la mejor manera, en mi humilde opinión, ya que puede utilizar la aritmética en el timedelta y cualquier objeto datetime. –

+8

divmod() gana. vea abajo. – fiorix

+7

Esto fallará con más de un día de segundos. –

481

Mediante el uso de la función divmod(), que hace sólo una única división para producir tanto el cociente y el resto, que puede tener el resultado muy rápidamente con sólo dos operaciones matemáticas:

m, s = divmod(seconds, 60) 
h, m = divmod(m, 60) 
print "%d:%02d:%02d" % (h, m, s) 
+36

+1 para divmod. Está hecho para situaciones como esta. –

+0

En segundo lugar, afirmación de Paolo: nunca antes había oído hablar de Divmod. Tendré que recordarlo. – Smashery

+6

He editado su respuesta para incluir un enlace a la documentación, ya que se recomienda hacerlo siempre que sea posible. –

45

casi no puedo nombrar que una manera fácil (al menos yo no puedo recordar la sintaxis), pero es posible utilizar time.strftime, que da más control sobre el formato:

>>> import time 
>>> time.strftime("%H:%M:%S", time.gmtime(666)) 
'00:11:06' 

gmtime se utiliza para convertir los segundos a un formato de tupla especial que strftime() requiere.

+0

Bueno, la respuesta se proporciona aquí: http://stackoverflow.com/questions/1384406/python-convert-seconds-tohhmmss?lq=1 –

+6

Desafortunadamente, este método comienza a medir días desde 1, por lo que no está diseñado para representar el delta del tiempo, por lo que es un accidente esperando que ocurra. Por ejemplo, con 'time.strftime ('% d% H:% M:% S', time.gmtime (1))' => '1 day, 0:00:01'. –

25
>>> "{:0>8}".format(datetime.timedelta(seconds=66)) 
>>> '00:01:06' # good 

y:

>>> "{:0>8}".format(datetime.timedelta(seconds=666777)) 
>>> '7 days, 17:12:57' # nice 

sin ': 0> 8':

>>> "{}".format(datetime.timedelta(seconds=66)) 
>>> '0:01:06' # not HH:MM:SS 

y:

>>> time.strftime("%H:%M:%S", time.gmtime(666777)) 
>>> '17:12:57' # wrong 

pero:

>>> "{:0>8}".format(datetime.timedelta(seconds=620000)) 
>>> '7 days, 4:13:20' # bummer 
+1

falla si el delta es menor que un segundo: '" {: 0> 8} ". Format (timedelta (milisegundos = 66)) '0: 00: 00.066000'' – jfs

+1

Para todos los demás: El' sin': 0> 8 ': 'falta un encabezado 0.' {: 0> 8} 'cero almohadillas a la izquierda 8 ceros. – TankorSmash

+2

En python 3.5.2, obtengo un TypeError. Estoy formateando una variable 'time.time() - start'. ¿Alguna idea? 'TypeError: cadena de formato no vacía pasada al objeto .__ format__' – medley56

2

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

¿Cuál es la ventaja de esto sobre la respuesta anterior? 'str (datetime.timedelta (seconds = 666))' –

+0

@RiazRizvi proporciona una longitud de cadena consistente para microsegundos para valores '666.0' y' 666.1'. –

6

Si usted necesita para obtener datetime.time valor, puede utilizar este truco:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time() 

No se 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 se puede utilizar cualquier número mayor que 0. Aquí utilizamos el hecho de que datetime.fromordinal siempre devolverá datetime objeto con time componente siendo cero.

Cuestiones relacionadas