嘿我正在使用datetime在python中工作,我想知道解析这个时间戳的最佳方法是什么。
时间戳是ISO标准,下面是一个例子“2010-06-19T08:17:14.078685237Z”
到目前为止,我已经使用了
time = datetime.datetime.strptime(timestamp.split(".")[0], "%Y-%m-%dT%H:%M:%S")
precisetime = time + datetime.timedelta(0,float("." + timestamp[:-1].split(".")[0]))
这种作品,但我觉得应该有一种更简化的方式(我对python很新,我相信我这样做就像一个屁股)。另外,我的时间戳中有纳秒,但在我的datetime对象中只有几微秒,是否有更好的模块可供使用?我需要能够在时间上进行操作,例如减去时间并将它们放入调度程序中。
有什么更好的方法可以解决这个问题吗?
答案 0 :(得分:7)
您可以使用Numpy的datetime64:http://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html
它支持纳秒和更高的精度。
>>> import numpy as np
>>> np.version.version
'1.7.1'
>>> np.datetime64("2010-06-19T08:17:14.078685237Z", dtype="datetime64[ns]")
numpy.datetime64('2010-06-19T08:17:14.078685237+0000')
答案 1 :(得分:4)
datetime
只精确到微秒。即10e-6
。
所以
14.078685237
将被截断为
14.078685
如果你做了上面所做的事。
最好只在float
中分别保持亚秒,然后执行一些浮点模数运算来跟踪它。
我觉得datetime
不这样做是荒谬的。
对于那些说时钟不够准确的人。 这不是唯一的用例。当你来回转换时不时。 (乘以光速。) 1微秒是300米。 300米是3个足球场的长度。这是准确性的总废话。
答案 2 :(得分:2)
答案 3 :(得分:1)
您的代码看起来很好。我不知道更好的方法,但我不是datetime
专家。就个人而言,我会将它包装在一个函数中,每行做一点工作,但这只是我的风格:
def parse_iso_timestamp(timestamp)
ts, partial_seconds = timestamp[:-1].split('.')
partial_seconds = float("." + partial_seconds)
time = datetime.datetime.strptime(ts, "%Y-%m-%dT%H:%M:%S")
precisedatetime = time + datetime.timedelta(seconds=partial_seconds)
return precisedatetime
编辑:我同意Rob Cowie的回答。无需重新发明轮子。
答案 4 :(得分:0)
以下是使用正则表达式的替代方法,您可能(或可能不)找到清洁程序:
import re
timestamp = "2010-06-19T08:17:14.078685237Z"
ts_regex = re.compile(r"(\d{4})-(\d{1,2})-(\d{1,2})T(\d{2}):(\d{2}):(\d{2})\.(\d{6})")
precisetime = datetime.datetime(*map(int, ts_regex.match(timestamp).groups()))
这里分为几个步骤来提供一些清晰度:
>>> ts_regex.match(timestamp).groups()
('2010', '06', '19', '08', '17', '14', '078685')
>>> map(int, ts_regex.match(timestamp).groups())
[2010, 6, 19, 8, 17, 14, 78685]
我们可以使用datetime
的参数扩展将此列表直接传递给*
对象的初始化,因为参数的顺序正确。