2009-04-21 9 views
298

У меня есть функция, которая возвращает информацию в секундах, но мне нужно сохранить эту информацию в часах: минуты: секунды.Как конвертировать секунды в часы, минуты и секунды?

Есть ли простой способ конвертировать секунды в этот формат в python?

+11

Обратную эту проблему можно найти на странице [Как преобразовать временную строку H: MM: SS в секундах в Python?] (Http://stackoverflow.com/questions/6402812/how-to-convert-an -hmmss-time-string-to-seconds-in-python) – hughes

ответ

467

или вы можете сделать

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

Это лучший способ, IMHO, так как вы можете использовать арифметику на timedelta и любых объектах datetime. –

+8

divmod() выигрывает. Смотри ниже. – fiorix

+7

Это не удастся с более чем на один день. –

481

Используя функцию divmod(), которая делает только одно деление, чтобы произвести как частное и остаток, то результат может быть очень быстро и только две математические операции:

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

+1 для divmod. Это _made_ для таких ситуаций. –

+0

I второе заявление Паоло - до сих пор не слышал о divmod. Я должен буду это запомнить. – Smashery

+6

Я отредактировал ваш ответ, чтобы включить ссылку на документацию, так как это рекомендуется делать, когда это возможно. –

45

Я не могу назвать, что это простой способ (по крайней мере, я не помню синтаксис), но можно использовать time.strftime, что дает больший контроль над форматированием:

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

gmtime Используется для преобразования секунд в специальный формат кортежа, который требуется strftime().

+0

Ну, ответ на самом деле представлен здесь - http://stackoverflow.com/questions/1384406/python-convert-seconds-to-hhmmss?lq=1 –

+6

К сожалению, этот метод начинает измерять дни с 1, поэтому он не разработан для представления временной дельта, и поэтому это несчастный случай, ожидаемый. Например, с 'time.strftime ('% d% H:% M:% S', time.gmtime (1))' => '1 день, 0:00:01'. –

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

и:

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

без ': 0> 8':

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

и:

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

но:

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

он не работает, если дельта меньше секунды: '' {: 0> 8} ". Format (timedelta (миллисекунды = 66)) '0: 00: 00.066000'' – jfs

+1

Для всех остальных:' без': 0> 8 ': 'example отсутствует ведущая 0.' {: 0> 8} 'нулевые прокладки влево 8 нулей. – TankorSmash

+2

В python 3.5.2 я получаю TypeError. Я форматирую переменную 'time.time() - start'. Любое понимание? 'TypeError: строка непустого формата, переданная объекту .__ format__' – medley56

2

Вот как я это понял.

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) 

Некоторые примеры:

$ 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

В чем преимущество этого ответа выше? 'str (datetime.timedelta (seconds = 666))' –

+0

@RiazRizvi дает согласованную длину строки для микросекунд для значений '666.0' и' 666.1'. –

6

Если вам нужно получить datetime.time значение, вы можете использовать этот трюк:

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

Вы не можете добавлять timedelta к time, но может добавить его в datetime.

UPD: Еще один вариант того же метода:

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

Вместо 1 вы можете использовать любое число больше 0. При этом мы используем тот факт, что datetime.fromordinal всегда будет возвращать datetime объект с time компонентом равным нулю.

Смежные вопросы