将十进制时间戳转换为日期时间时如何保留微秒?

时间:2018-09-23 18:09:04

标签: python python-3.x datetime

我有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时如何保留微秒?

4 个答案:

答案 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)