我有dpkt库中的时间戳等值(数据包到达时):

for ts, buffer in dpkt.pcap.Reader(file):
    #whatever...


读者以小数形式给出ts,例如

print(repr(ts))
Decimal('1536310893.687185000')


我正在尝试将其转换为datetime,但是没有得到微秒(实际上是毫微秒,但是目前只有微秒很重要)

ts_dt = datetime.datetime.utcfromtimestamp(ts)
ts_dt
datetime.datetime(2018, 9, 7, 9, 1, 33)


由于某些原因,utcfromtimestamp不会考虑十进制值的小数部分。

是虫子吗?它在Python 2.7中工作

我可以将Decimal转换为float,并且可以,但是我讨厌这种方法-浮点数的精度有限。在某些版本中,可能会因细微的更改而被破坏,或者我的值可能不准确,这可能是一场灾难,并且很难进行故障排除...我更愿意在可能的情况下拥有准确的值和准确的计算(尤其是在转换时间戳的琐事中...)

那么在将Decimal时间戳转换为datetime时如何保留微秒?

最佳答案

不知道为什么这在Python3.6 +中不起作用,但是进行无浮点转换的一种方法是使用datetime.replace()设置微秒,例如:

码:

ts_dt = dt.datetime.utcfromtimestamp(ts).replace(microsecond=(ts - int(ts)) * 1000000)


测试代码:

import datetime as dt

ts_dt = dt.datetime.utcfromtimestamp(ts)
print(ts_dt)

ts_dt = dt.datetime.utcfromtimestamp(ts).replace(microsecond=(ts - int(ts)) * 1000000)
print(ts_dt)


结果:

2018-09-07 09:01:33
2018-09-07 09:01:33.687185

09-10 06:04
查看更多