在python中使用高精度时间戳

时间:2011-06-01 20:39:32

标签: python datetime time

嘿我正在使用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对象中只有几微秒,是否有更好的模块可供使用?我需要能够在时间上进行操作,例如减去时间并将它们放入调度程序中。

有什么更好的方法可以解决这个问题吗?

5 个答案:

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

您的方法没有任何内在的瑕疵,但您可能想尝试pyiso8601dateutil

答案 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的参数扩展将此列表直接传递给*对象的初始化,因为参数的顺序正确。