将微秒格式化为两位小数(实际上是转换为十微秒)
我正在使用以下代码来打印时间戳:
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