添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
刚毅的棒棒糖  ·  RWKV-Runner ...·  2 周前    · 
很拉风的红酒  ·  android webview ...·  1 年前    · 
会搭讪的饭盒  ·  [Spring Cloud Task]3 ...·  1 年前    · 

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

1 个评论
这个问题的反面可以在以下网址找到 如何在 Python 中将 H:MM:SS 时间字符串转换为秒数?
python
datetime
Specto
Specto
发布于 2009-04-22
18 个回答
SilentGhost
SilentGhost
发布于 2019-11-04
已采纳
0 人赞同

你可以使用 datetime.timedelta function:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
    
这是最好的方法,IMHO,因为你可以对timedelta和任何datetime对象使用算术。
这对多天都有效。 str(datetime.timedelta(seconds=60*60*24+1)) = '1 day, 0:00:01'
CPBL
str(datetime.timedelta(seconds=round(666666.55))) 正确显示天数;取消小数点后的秒数。
cprn
timedelta 不是溢出安全的,不能正确执行数学运算,例如 str(timedelta(hours=8) - timedelta(hours=10)) 的结果是 '-1 day, 22:00:00' ,而基于整数的解决方案正是针对那些你需要 '-02:00:00' 的情况。
@FaiyazHaider 这不是正确的代码。 Timedelta字符串也将包括天数,然后会说 1 day, 1:23:45 你的代码会将其改为 01 day, 1:23:45 至于@cprn的 "溢出安全 "警告,这一点都不奇怪 , 物体并不意味着可以以这种方式进行减法。 它们是两个时间戳之间差异的代表。 它们不是用来比较四个时间戳之间的两个差异的(这就是你基本上在做的)。 ;-)阅读文档。
Brandon Rhodes
Brandon Rhodes
发布于 2019-11-04
0 人赞同

By using the divmod() 函数,它只做一次除法来产生商和余数,你只需进行两次数学运算就能很快得到结果。

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

然后用字符串格式化 to convert the result into your desired output:

print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
    
bufh
如果你喜欢运算符而不是函数,请使用modulo;例如(只有分钟/秒)。【替换代码0
而且你可以把它延长到几天。 d, h = divmod(h, 24)
@MarkRansom:再到几个月 m, d = divmod(m, 31) 。哦,不,你不能。更糟的是,如果闰秒出现在游戏中,你的代码就会出错。长话短说:使用 timedelta ,不要乱用日历,它会咬你的。
@Tibo timedelta 是否处理闰秒?我怀疑不是。在很多应用中,这种简单的数学计算是绰绰有余的。
对于那些讨论日期时间的人来说:请注意,最初的问题并不希望将小时分解成任何更大的时间单位,所以任何创造出比小时更大的时间单位的东西,都需要手动将它们还原为一个完整的小时数。
anatoly techtonik
anatoly techtonik
发布于 2019-11-04
0 人赞同

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

Unfortunately this method starts measuring days from 1 so it isn't designed to represent time delta, and so it is an accident waiting to happen. For example with time.strftime('%d %H:%M:%S', time.gmtime(1)) => '1 day, 0:00:01'.
不能显示秒=0.0236的小数(如Božo Stojković的答案那样)。
marcell
marcell
发布于 2019-11-04
0 人赞同

Using datetime :

With the ':0>8' format:

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'

Without the ':0>8' format:

"{}".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'

Using 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
    
jfs
如果delta小于1秒,就会失败。替换代码0
对其他人来说: without ':0>8': 的例子缺少一个前导0。 {:0>8} 的0垫在左边8个0。
在python 3.5.2中,我得到一个TypeError。我正在格式化一个 time.time()-start 的变量。有什么见解吗? TypeError: non-empty format string passed to object.__format__
我试着用 datetime.now() 而不是 time.time() 来生成我的timedelta对象,我得到同样的错误。
@medley56 在使用Python3时,如果你要使用 str() 这样的格式,你需要使用 0>8 "{:0>8}".format(str(datetime.timedelta(seconds=666777))) 。检查 这个答案 for more info.
doories
doories
发布于 2019-11-04
0 人赞同

This is my quick trick:

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

For more info Visit: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan

你不知道我找这个答案找了多久。太感谢你了。我希望我可以给你更多的+1。
令人惊讶。甚至在秒数很大时也能完美调整( 604800 变成 1 week )。
@Armster 我知道这有点晚了,但对于那些简单的加注不够的答案,你可以授予一个 bounty of your own rep.
naive decoder
naive decoder
发布于 2019-11-04
0 人赞同

The following set worked for me.

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']
    
你也许应该把a、b和c四舍五入
@JeanRavenclaw: a b c 是整数--实际上是整数转换为字符串。
b, c = divmod(seconds%3600, 60) 会更简洁一些。
ddzzbbwwmm
ddzzbbwwmm
发布于 2019-11-04
0 人赞同

This is how I got it.

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']
    
与上面的答案相比,这样做的好处是什么? 【替换代码0
@RiazRizvi给出了 666.0 666.1 值的微秒的一致字符串长度。
Sam
Sam
发布于 2019-11-04
0 人赞同

小时(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
    
虽然这段代码可能为OP的问题提供了一个解决方案,但最好是添加上下文,说明它为什么/如何工作。这可以帮助未来的用户学习,并将这些知识应用于他们自己的代码。当代码被解释后,你也有可能从用户那里得到积极的反馈,即加分。
MarSoft
MarSoft
发布于 2019-11-04
0 人赞同

如果你需要得到 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()

在这里,我们使用datetime.fromordinal将总是返回datetime对象,而time组件为零。

Tomas Trdla
Tomas Trdla
发布于 2019-11-04
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 '-'

Results in:

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)) 
    
你的缩进被破坏了。
0 人赞同

如果你需要把小时、分钟和秒也作为浮点访问, 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)))

Prints

01:30:40
J-L
我得到的输出与你的不同,这使我认为你有一个打字错误。 你可能是想用 seconds=5440 而不是 seconds=5540 。 不过,我喜欢你的答案!
alosha002
alosha002
发布于 2019-11-04
0 人赞同

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

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

当你再次除以60时,你会得到小时数

Andre
Andre
发布于 2019-11-04
0 人赞同

在我的案例中,我想达到的格式是 "HH:MM:SS.ffff"。 我是这样解决的。

timestamp = 28.97000002861023
str(datetime.fromtimestamp(timestamp)+timedelta(hours=-1)).split(' ')[1][:12]
'00:00:28.970'
    
Jessica Haskins
Jessica Haskins
发布于 2019-11-04
0 人赞同

如果你想把一个日期上的 "自午夜起的秒数 "的单个值转换为数据时间对象或HH:MM:SS的字符串,上面的解决方案是可行的,但我来到这个页面是因为我想在pandas的整个数据框架列上做这个事情。如果有人想知道如何在同一时间对超过一个单一的值进行处理,最终对我有用的方法是。

 mydate='2015-03-01'
 df['datetime'] = datetime.datetime(mydate) + \ 
                  pandas.to_timedelta(df['seconds_since_midnight'], 's')
    
Lucas Urban
Lucas Urban
发布于 2019-11-04
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))

RESULT: 5:22:26

Syntax of return_hms() function

The return_hms() function is used like this:

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

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

0或更少。不应用任何零

1:当分和秒低于10时,对它们应用零。

2或更多。当任何数值(包括小时)低于10时,对其应用零。

onlyvinish
onlyvinish
发布于 2019-11-04
0 人赞同

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

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

Results:

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

Python: 3.8.8

Denis Kerstens Denisik35
Denis Kerstens Denisik35
发布于 2019-11-04
0 人赞同
division = 3623 // 3600 #to hours division2 = 600 // 60 #to minutes