如何将timedelta的微秒格式化为2位小数?

3
"最初的回答":运行以下代码
import time
import datetime

timenow = time.time()
timedifference = time.time() - timenow
timedifference = datetime.timedelta( seconds=timedifference )
print( "%s" % timedifference )

I got this:

0:00:00.000004

如何使用deltatime对象格式化微秒为两位小数并进行四舍五入?

原始答案: "最初的回答"
0:00:00.00

相关问题:

  1. 如何将时间差表示为时分秒毫秒
  2. 如何将微秒格式化为两位小数(实际上是将微秒转换为十分之一微秒)
注: "Original Answer" 翻译成 "最初的回答"

1
太明显(也是错误的)的解决方案是使用字符串切片。 - Antti Haapala -- Слава Україні
运行得非常顺利!timedifference = str(timedifference)[:-4] - Evandro Coan
而且正如我所说的那样,它是错误的,请尝试使用零毫秒。 - Antti Haapala -- Слава Україні
我已经看过了。我显示的是0:0或类似的东西。但没关系,一切都好。 - Evandro Coan
4个回答

3
另一种解决方法是将小数部分进行数字拆分,并分别进行格式化:
>>> seconds = 123.995
>>> isec, fsec = divmod(round(seconds*100), 100)
>>> "{}.{:02.0f}".format(timedelta(seconds=isec), fsec)
'0:02:04.00'

正如您所看到的,这样处理可以进行四舍五入。同样的,只需将上面的100更改为另一个10的幂(并调整格式字符串),就可以轻松地调整输出精度:
def format_td(seconds, digits=2):
    isec, fsec = divmod(round(seconds*10**digits), 10**digits)
    return ("{}.{:0%d.0f}" % digits).format(timedelta(seconds=isec), fsec)

这个是不错的,但我仍然得到类似于1:00:20.30的结果,而我想要的是01:00:20.30。我尝试了{:0>8}.{:02.0f},但它失败了。还有{%H:%M:%S}.{02.0f}也不起作用。有没有一种快速正确地写出来的方法? - Peter.k
@Peter.k 只要你用 str(...) 包裹 timedelta(seconds=isec){:0>8}.{:02.0f} 这种方法应该可以正常工作。 - Seb

3

使用 str() 将时间差转换为字符串后,使用 .split('.') 分隔小数点两侧的内容。然后保留小数点前面的第一部分,即 [0]

以下是您的示例,只有最后一行不同:

import time
import datetime

timenow = time.time()
timedifference = time.time() - timenow
timedifference = datetime.timedelta( seconds=timedifference )
print( "%s" % str(timedifference).split('.')[0] )

生成:

0:00:00

不得不承认,它既优雅又简洁(在我看来很符合Python的风格)。 - Chris

2
你需要自己进行格式化。一个timedelta对象包含dayssecondsmicroseconds,因此您需要进行数学计算以转换为天/小时/分钟/秒/微秒,然后使用python的string.format进行格式化。对于你的微秒,你需要((microsec+5000)/10000)来获取前两位数字(+5000用于四舍五入)。最初的回答。

2

有点晚了,但这里是一个使用f-strings的2021年答案(修改自@Seb的原始答案):

def format_td(seconds, digits=3):
    isec, fsec = divmod(round(seconds*10**digits), 10**digits)
    return f'{timedelta(seconds=isec)}.{fsec:0{digits}.0f}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接