我有dpkt库中的时间戳记(当数据包到达时):
for ts, buffer in dpkt.pcap.Reader(file):
#whatever...
Reader给出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
时如何保留微秒?
答案 0 :(得分:3)
不知道为什么这在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
答案 1 :(得分:0)
您为什么使用Decimal
。看来,在datetime中使用之前,小数已转换为int。将其显式转换为float:
ts_dt = datetime.datetime.utcfromtimestamp(foat(ts))
答案 2 :(得分:0)
为什么将其设为小数? float数据类型工作正常。
>>> import datetime
>>> ts = 1536310893.687185000
>>> ts_dt = datetime.datetime.utcfromtimestamp(ts)
>>> ts_dt
datetime.datetime(2018, 9, 7, 9, 1, 33, 687185)
答案 3 :(得分:0)
基于其他人的友好回答,我使用以下代码:
def datetime_from_decimal(timestamp):
if isinstance(timestamp, Decimal):
whole, fractional = divmod(timestamp, 1)
mcs = int(fractional * 1000000)
return datetime.datetime.utcfromtimestamp(whole).replace(microsecond = mcs)
else:
return datetime.datetime.utcfromtimestamp(timestamp)
datetime_from_decimal(Decimal('1536310895.988003000'))
datetime.datetime(2018, 9, 7, 9, 1, 35, 988003)