我在格式时代一些日志文件HH:MM :: SS.nano_seconds(如01:02:03.123456789)。 我想在Python中创建一个日期时间,所以我可以做整齐的时间数学(例如需要时间的差异)。 strptime非常适用于使用%F 微秒 。 不要Python的日期时间和时间模块真的不支持纳秒?
Answer 1:
你可以看到从源是datetime对象不支持任何比微秒更精细。 正如评论所指出的迈克彭宁顿,这是因为实际的硬件时钟是没有这么精确 。 维基百科说HPET具有频率“至少10MHz的”,这意味着每100纳秒一个打勾。
如果你能投出的最后三位数字(这可能是没有太大的意义反正)生活,你可以通过只切片输入字符串有只有六个小数点后的数字,并与解析解析此%f
。 否则,它看起来像你必须自己实现减法。
Answer 2:
你可以很自然地使用毫微秒,甚至更精确的时间单位(PS,FS,AS) numpy
。 NumPy的有自己的日期时间和Timedeltas实现,所以你可以尝试np.datetime64
:
import numpy as np
def str_to_ns(time_str):
"""
input: time in a format `hh:mm:ss.up_to_9_digits`
"""
h, m, s = time_str.split(":")
int_s, ns = s.split(".")
ns = map(lambda t, unit: np.timedelta64(t, unit),
[h,m,int_s,ns.ljust(9, '0')],['h','m','s','ns'])
return sum(ns)
然后,你可以在下面的方式使用该功能:
>>> src = "1:2:34.123456789"
>>> out = str_to_ns(src)
>>> print(out)
3754123456789 nanoseconds
>>> out / np.timedelta64(1,'h')
1.0428120713302778
>>> out / np.timedelta64(1,'m')
62.568724279816664
>>> out / np.timedelta64(1,'s')
3754.123456789
算术也是可能的:
>>> t1, t2 = str_to_ns("1:0:12.12345678"), str_to_ns("1:0:12.12")
>>> t1 - t2
numpy.timedelta64(3456780,'ns')
我同意,这不是那么自然,但以这种方式就可以实现只用任意高的时间精度numpy
。
文章来源: Parsing datetime strings containing nanoseconds