你可以使用
datetime.timedelta
function:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
刚毅的棒棒糖 · RWKV-Runner ...· 2 周前 · |
打酱油的椰子 · homebrew | 镜像站使用帮助 | ...· 1 年前 · |
暗恋学妹的黑框眼镜 · SqlConnection.Connecti ...· 1 年前 · |
很拉风的红酒 · android webview ...· 1 年前 · |
会搭讪的饭盒 · [Spring Cloud Task]3 ...· 1 年前 · |
有没有一种简单的方法可以在Python中把秒数转换成这种格式?
你可以使用
datetime.timedelta
function:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
这是最好的方法,IMHO,因为你可以对timedelta和任何datetime对象使用算术。
hyprnick
:
这对多天都有效。
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
发布于
2019-11-04
0
人赞同
bufh
:
如果你喜欢运算符而不是函数,请使用modulo;例如(只有分钟/秒)。【替换代码0
而且你可以把它延长到几天。
d, h = divmod(h, 24)
。
@MarkRansom:再到几个月
m, d = divmod(m, 31)
。哦,不,你不能。更糟的是,如果闰秒出现在游戏中,你的代码就会出错。长话短说:使用
timedelta
,不要乱用日历,它会咬你的。
@Tibo
timedelta
是否处理闰秒?我怀疑不是。在很多应用中,这种简单的数学计算是绰绰有余的。
对于那些讨论日期时间的人来说:请注意,最初的问题并不希望将小时分解成任何更大的时间单位,所以任何创造出比小时更大的时间单位的东西,都需要手动将它们还原为一个完整的小时数。
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'.
Juha M
:
不能显示秒=0.0236的小数(如Božo Stojković的答案那样)。
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
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
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
发布于
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
发布于
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
borchvm
:
虽然这段代码可能为OP的问题提供了一个解决方案,但最好是添加上下文,说明它为什么/如何工作。这可以帮助未来的用户学习,并将这些知识应用于他们自己的代码。当代码被解释后,你也有可能从用户那里得到积极的反馈,即加分。
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
发布于
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))
zrajm
:
你的缩进被破坏了。
teekarna
发布于
2019-11-04
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
发布于
2019-11-04
0
人赞同
你可以用秒除以60,得到分钟。
import time
seconds = time.time()
minutes = seconds / 60
print(minutes)
当你再次除以60时,你会得到小时数
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
发布于
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
发布于
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
发布于
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
发布于
2019-11-04
0
人赞同
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes