解析包含纳秒日期时间字符串解析包含纳秒日期时间字符串(Parsing datetime string

2019-05-14 04:49发布

我在格式时代一些日志文件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