如何将秒转换为小时、分钟和秒?

我有一个以秒为单位返回信息的函数,但我需要以小时:分钟:秒为单位存储该信息。

在Python中是否有一种简单的方法将秒转换为这种格式?

585737 次浏览

通过使用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+

你可以使用datetime.timedelta函数:

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

我很难说出一个简单的方法(至少我不记得语法),但可以使用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之后截断

使用# EYZ0:

使用':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'

使用# EYZ0:

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

我是这样得到它的。

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

如果你需要获得datetime.time值,你可以使用这个技巧:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()

您不能将timedelta添加到time,但可以将它添加到datetime

乌利希期刊指南:同样的技巧的另一种变化:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()

您可以使用任何大于0的数字代替1。这里我们使用的事实是,datetime.fromordinal将总是返回datetime对象,time组件为零。

这是我的小把戏:

from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'

更多信息请访问: # EYZ0 < / p >

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

下面这套对我很有用。

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

division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes

PS:我的代码不专业

你可以用秒除以60得到分钟

import time
seconds = time.time()
minutes = seconds / 60
print(minutes)

再除以60,就得到小时数

小时(h)秒除以3600(60分钟/小时* 60秒/分钟)

分钟(m)由剩余秒数(小时计算余数,%)除以60(60秒/分钟)计算得出

同样,秒(s)按小时余数和分钟计算。

剩下的只是字符串格式化!

def hms(seconds):
h = seconds // 3600
m = seconds % 3600 // 60
s = seconds % 3600 % 60
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)


print(hms(7500))  # Should print 02h05m00s
在我的例子中,我想实现格式 “HH: MM: SS.fff"。 我是这样解的:

timestamp = 28.97000002861023
str(datetime.fromtimestamp(timestamp)+timedelta(hours=-1)).split(' ')[1][:12]
'00:00:28.970'

上面的解决方案将工作,如果您正在寻找转换单个值“;秒午夜”;一个日期到一个datetime对象或一个HH:MM:SS的字符串,但我登陆这个页面是因为我想在pandas的整个数据框架列上做这个。如果有人想知道如何在同一时间为多个值做到这一点,最后为我工作的是:

 mydate='2015-03-01'
df['datetime'] = datetime.datetime(mydate) + \
pandas.to_timedelta(df['seconds_since_midnight'], 's')

以下是我经常使用的一种方法:(不管它有多低效)

seconds = 19346
def zeroes (num):
if num < 10: num = "0" + num
return num


def return_hms(second, apply_zeroes):
sec = second % 60
min_ = second // 60 % 60
hrs = second // 3600
if apply_zeroes > 0:
sec = zeroes(sec)
min_ = zeroes(min_)
if apply_zeroes > 1:
hrs = zeroes(hrs)
return "{}:{}:{}".format(hrs, min_, sec)


print(return_hms(seconds, 1))


< p >结果: # EYZ0 < / p >

return_hms()函数的语法

return_hms()函数是这样使用的:

第一个变量(秒)是你想转换成h:m:s的秒数。

第二个变量(apply_0s)是格式化:

0或更少:不应用任何零

1:当分钟和秒低于10时,将0应用于分钟和秒。

2或更多:当值小于10时,对任何值(包括小时)应用0。

下面是一个简单的程序,它读取当前时间并将其转换为以小时、分钟和秒为单位的一天时间

import time as tm #import package time
timenow = tm.ctime() #fetch local time in string format


timeinhrs = timenow[11:19]


t=tm.time()#time.time() gives out time in seconds since epoch.


print("Time in HH:MM:SS format is: ",timeinhrs,"\nTime since epoch is : ",t/(3600*24),"days")

输出为

Time in HH:MM:SS format is:  13:32:45
Time since epoch is :  18793.335252338384 days

有点离题,但可能对某人有用

def time_format(seconds: int):
if seconds is not None:
seconds = int(seconds)
d = seconds // (3600 * 24)
h = seconds // 3600 % 24
m = seconds % 3600 // 60
s = seconds % 3600 % 60
if d > 0:
return '{:02d}D {:02d}H {:02d}m {:02d}s'.format(d, h, m, s)
elif h > 0:
return '{:02d}H {:02d}m {:02d}s'.format(h, m, s)
elif m > 0:
return '{:02d}m {:02d}s'.format(m, s)
elif s > 0:
return '{:02d}s'.format(s)
return '-'

结果:

print(time_format(25*60*60 + 125))
>>> 01D 01H 02m 05s
print(time_format(17*60*60 + 35))
>>> 17H 00m 35s
print(time_format(3500))
>>> 58m 20s
print(time_format(21))
>>> 21s

我看了这里的每一个答案,仍然尝试自己的答案

def a(t):
print(f"{int(t/3600)}H {int((t/60)%60) if t/3600>0 else int(t/60)}M {int(t%60)}S")

结果:

>>> a(7500)
2H 5M 0S
>>> a(3666)
1H 1M 6S

Python: 3.8.8