将微秒格式化为两位小数(实际上是转换为十微秒)

2 投票
3 回答
4001 浏览
提问于 2025-04-29 21:59

我正在使用以下代码来打印时间戳:

strftime('%d-%m-%Y %H:%M:%S.%f')

不过,我想把微秒的部分四舍五入到小数点后两位,而不是打印六位小数。有没有更简单的方法来做到这一点,而不是每次都要把所有的时间元素拆开,格式化并把微秒四舍五入到两位小数,然后再格式化一个新的“打印字符串”?

暂无标签

3 个回答

2

根据jfs的回答,我又添加了一条语句,内容是

replace(microsecond=round(d.microsecond, ndigits))

这样做可能会出现一个错误:ValueError: microsecond must be in 0..999999

也就是说,如果微秒的值在995000到999999之间,使用round(microsecond, ndigits)就会得到1000000。

d = datetime.utcfromtimestamp(time.time())
decimal_places = 2
ndigits = decimal_places - 6
r = round(d.microsecond, ndigits)
if r > 999999:
    r = 999999
d = d.replace(microsecond=r)
ts = d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:ndigits]
4

你需要自己进行四舍五入;先用字符串格式化的方式把日期格式化成没有微秒的样子,然后再单独把microsecond属性的前两位数字加上去:

'{:%d-%m-%Y %H:%M:%S}.{:02.0f}'.format(dt, dt.microsecond / 10000.0)

示例:

>>> from datetime import datetime
>>> dt = datetime.now()
>>> '{:%d-%m-%Y %H:%M:%S}.{:02.0f}'.format(dt, dt.microsecond / 10000.0)
'27-10-2014 11:56:32.72'
1

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是使用的工具和环境不兼容。为了找到问题的根源,我们可以使用一些调试工具,或者在代码中加入一些打印信息,帮助我们查看程序运行的状态。

另外,了解错误信息也很重要。错误信息通常会告诉我们出错的地方和原因,虽然有时候看起来很复杂,但只要仔细分析,就能找到解决办法。

总之,遇到问题时不要慌张,逐步排查,利用工具和错误信息,通常都能找到解决方案。

decimal_places = 2
ndigits = decimal_places - 6
assert ndigits < 0
d = d.replace(microsecond=round(d.microsecond, ndigits))
print(d.strftime('%d-%m-%Y %H:%M:%S.%f')[:ndigits])
# -> 2014-10-27 11:59:53.87

撰写回答