Как я могу преобразовать секунды в часы, минуты и секунды?

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

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

Ответ 1

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

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

Ответ 2

Используя 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+

Ответ 3

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

from time import strftime
from time import gmtime

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

strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'

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

Примечание: усечения после 23:59:59

Ответ 4

Используя datetime:

С форматом ':0>8':

from datetime import timedelta

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

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

"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

Без формата ':0>8':

"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

Используя time:

from time import gmtime
from time import strftime

# NOTE: The following resets if it goes over 23:59:59!

strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'

strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'

strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'

strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong

Ответ 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 равным нулю.

Ответ 7

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

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

Ответ 8

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

Ответ 9

Следующий набор работал для меня.

def sec_to_hours(seconds):
    a=str(seconds//3600)
    b=str((seconds%3600)//60)
    c=str((seconds%3600)%60)
    d=["{} hours {} mins {} seconds".format(a, b, c)]
    return d


print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']

print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']