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

时间:2009-04-21 23:08:17

标签: python

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

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

17 个答案:

答案 0 :(得分:605)

您可以使用datetime.timedelta功能:

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

答案 1 :(得分:573)

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

答案 2 :(得分:56)

我很难说一个简单的方法(至少我不记得语法),但可以使用time.strftime,这可以更好地控制格式:

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

gmtime用于将秒转换为strftime()所需的特殊元组格式。

答案 3 :(得分:32)

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

答案 4 :(得分:13)

这是我的快速伎俩:

import humanfriendly
humanfriendly.format_timespan(secondsPassed)

访问: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan 了解更多信息。

答案 5 :(得分:8)

如果您需要获得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()

您可以使用大于0的任何数字而不是1。我们使用datetime.fromordinal将始终返回datetime对象且time组件为零的事实。< / p>

答案 6 :(得分:4)

这就是我得到它的方式。

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

答案 7 :(得分:4)

小时数(h),以秒为单位的秒数(//)除以3600(60分钟/小时* 60秒/分钟)

分钟(米),以剩余秒数(小时计算中的剩余百分比,%)除以60(60秒/分钟)计算得出

类似地,以小时和分钟的余数计算秒数。

Rest只是字符串格式!

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

答案 8 :(得分:1)

以下设置对我有用。

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

答案 9 :(得分:0)

dateutil.relativedelta如果需要同时访问浮点数的小时,分​​钟和秒,则非常方便。 datetime.timedelta没有提供类似的界面。

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

打印

40.0
01:30:40

答案 10 :(得分:0)

就我而言,我想实现格式 “ HH:MM:SS.fff”。 我是这样解决的:

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

答案 11 :(得分:0)

如果您希望将日期中“自午夜以来的秒数”的单个值转换为日期时间对象或带有 HH:MM:SS 的字符串,则上述解决方案将有效,但我登陆此页面是因为我想要在熊猫的整个数据框列上执行此操作。如果其他人想知道如何一次为多个值执行此操作,那么最终对我有用的是:

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

答案 12 :(得分:0)

这是我一直使用的一种方式:(不管它多么低效)

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))

结果: 5:22:26

return_hms() 函数的语法

return_hms() 函数的用法如下:

第一个变量 (second) 是您要转换为 h:m:s 的秒数。

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

<块引用>

0 或更少:不应用任何零

<块引用>

1:当分钟和秒小于 10 时,将零应用于分钟和秒。

<块引用>

2 或更多:当它们低于 10 时,将零应用于任何值(包括小时数)。

答案 13 :(得分: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

答案 14 :(得分:0)

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

    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

答案 15 :(得分:-1)


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

PS我的代码不专业

答案 16 :(得分:-2)

您可以将秒除以60得到分钟数

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

再次将其除以60,就可以得到小时数