У меня есть функция, которая возвращает информацию в секундах, но мне нужно сохранить эту информацию в часах: минуты: секунды.Как конвертировать секунды в часы, минуты и секунды?
Есть ли простой способ конвертировать секунды в этот формат в python?
У меня есть функция, которая возвращает информацию в секундах, но мне нужно сохранить эту информацию в часах: минуты: секунды.Как конвертировать секунды в часы, минуты и секунды?
Есть ли простой способ конвертировать секунды в этот формат в python?
или вы можете сделать
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
Это лучший способ, IMHO, так как вы можете использовать арифметику на timedelta и любых объектах datetime. –
divmod() выигрывает. Смотри ниже. – fiorix
Это не удастся с более чем на один день. –
Используя функцию divmod()
, которая делает только одно деление, чтобы произвести как частное и остаток, то результат может быть очень быстро и только две математические операции:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
print "%d:%02d:%02d" % (h, m, s)
+1 для divmod. Это _made_ для таких ситуаций. –
I второе заявление Паоло - до сих пор не слышал о divmod. Я должен буду это запомнить. – Smashery
Я отредактировал ваш ответ, чтобы включить ссылку на документацию, так как это рекомендуется делать, когда это возможно. –
Я не могу назвать, что это простой способ (по крайней мере, я не помню синтаксис), но можно использовать time.strftime, что дает больший контроль над форматированием:
>>> import time
>>> time.strftime("%H:%M:%S", time.gmtime(666))
'00:11:06'
gmtime Используется для преобразования секунд в специальный формат кортежа, который требуется strftime()
.
Ну, ответ на самом деле представлен здесь - http://stackoverflow.com/questions/1384406/python-convert-seconds-to-hhmmss?lq=1 –
К сожалению, этот метод начинает измерять дни с 1, поэтому он не разработан для представления временной дельта, и поэтому это несчастный случай, ожидаемый. Например, с 'time.strftime ('% d% H:% M:% S', time.gmtime (1))' => '1 день, 0:00:01'. –
>>> "{: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
он не работает, если дельта меньше секунды: '' {: 0> 8} ". Format (timedelta (миллисекунды = 66)) '0: 00: 00.066000'' – jfs
Для всех остальных:' без': 0> 8 ': 'example отсутствует ведущая 0.' {: 0> 8} 'нулевые прокладки влево 8 нулей. – TankorSmash
В python 3.5.2 я получаю TypeError. Я форматирую переменную 'time.time() - start'. Любое понимание? 'TypeError: строка непустого формата, переданная объекту .__ format__' – medley56
Вот как я это понял.
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']
В чем преимущество этого ответа выше? 'str (datetime.timedelta (seconds = 666))' –
@RiazRizvi дает согласованную длину строки для микросекунд для значений '666.0' и' 666.1'. –
Если вам нужно получить 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
компонентом равным нулю.
Это мой быстрый трюк:
import humanfriendly
humanfriendly.format_timespan(secondsPassed)
визит: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan для получения дополнительной информации.
Это хороший модуль –
Обратную эту проблему можно найти на странице [Как преобразовать временную строку H: MM: SS в секундах в Python?] (Http://stackoverflow.com/questions/6402812/how-to-convert-an -hmmss-time-string-to-seconds-in-python) – hughes