我有一个以秒为单位返回信息的函数,但是我需要以小时:分钟:秒存储该信息。
是否有一种简便的方法可以在Python中将秒转换为这种格式?
您可以使用datetime.timedelta
功能:
datetime.timedelta
通过使用>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
函数,该函数仅进行一次除法以同时产生商和余数,您只需执行两个数学运算就可以非常快速地得到结果:
divmod()
然后使用divmod()
将结果转换为所需的输出:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
我很难说出这种简单的方法(至少我不记得语法),但是可以使用string formatting,它可以更好地控制格式:
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
[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'
所需的特殊元组格式。
注意:在23:59:59之后截断
strftime()
格式: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
如果需要获取from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
值,则可以使用此技巧:
https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
您不能将datetime.time
添加到my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
,但可以将其添加到timedelta
。
UPD:同一技术的另一种变化:
time
datetime
可以使用大于0的任何数字。在这里,我们使用my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
总是返回1
对象且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']
没有提供类似的界面。
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)))