Как перевести секунды в часы, минуты и секунды?



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



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

345   7  

7 ответов:

или

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

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

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

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

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

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

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

и:

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

без ':0>8':

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

и:

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

но:

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

Это мой быстрый трюк:

import humanfriendly
humanfriendly.format_timespan(secondsPassed)

визит: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan для дополнительной информации.

Если вам нужно получить 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 компонент равны нулю.

вот как я его получил.

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

Comments

    Ничего не найдено.