Как я могу преобразовать секунды в часы, минуты и секунды? - PullRequest
385 голосов
/ 22 апреля 2009

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

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

Ответы [ 8 ]

611 голосов
/ 22 апреля 2009

Вы можете использовать функцию datetime.timedelta:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
576 голосов
/ 22 апреля 2009

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

m, s = divmod(seconds, 60)
h, m = divmod(m, 60)

А затем используйте форматирование строки , чтобы преобразовать результат в желаемый результат:

print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
56 голосов
/ 01 июля 2014

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

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

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

32 голосов
/ 11 августа 2015
>>> 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
13 голосов
/ 06 апреля 2017

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

import humanfriendly
humanfriendly.format_timespan(secondsPassed)

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

8 голосов
/ 22 мая 2016

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

4 голосов
/ 03 ноября 2015

Вот так я и получил.

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']
2 голосов
/ 17 мая 2019

dateutil.relativedelta удобно, если вам нужно получить доступ к часам, минутам и секундам в виде числа с плавающей точкой. datetime.timedelta не предоставляет аналогичного интерфейса.

from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
    int(rt.hours), int(rt.minutes), int(rt.seconds)))

Печать

40.0
01:30:40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...