2011-06-01 86 views
4

嘿,我正在Python日期时间工作,我想知道什么是解析这个时间戳的最好方法是。在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非常陌生,我相信我会像屁股那样做)。另外,我的时间戳里有纳秒,但在我的日期时间对象中只有几微秒,是否有更好的模块可以使用?我需要能够在诸如减去时间和将它们放入调度程序的时间进行操作。

有没有更好的方法来解决这个问题?

+1

对不起,对于非生产性的评论,但“我对Python非常陌生,我确信我正在做这个像屁股” - >你,先生,让我大声笑出来。我们都去过那里。 – slezica 2011-06-01 20:43:15

+0

我还在写'ass code' – tMC 2011-06-01 20:47:18

回答

2

有什么本质上的屁股,像你的方法,但你可能想尝试pyiso8601dateutil

+1

'pyiso8601'和'dateutil'都返回只有微秒精度的'datetime'对象。 OP需要像['numpy.datetime64'](http://stackoverflow.com/a/20100652/4279)提供的纳秒级精度。 – jfs 2013-11-23 00:51:27

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 

编辑:我同意罗布·考伊的回答。没有必要重新发明轮子。

+2

另一方面:在一行中做尽可能多的工作已成为Python的时尚。我不确定我喜欢它。我更喜欢用变量名称记录的小块。 – 2011-06-01 21:05:25

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对象进行初始化。

+1

不需要那么喜欢你的正则表达式。这会给你你所需要的:'re.findall('\ d +',timestamp)'。然后,你可以把它放到一行:'precisetime = datetime.datetime(* map(int,re.findall('\ d +',timestamp))',它比它替换的行更短;) – 2011-06-01 21:25:29

+0

在这种情况下,单线程实际上不起作用,因为它将匹配小数点后的9个字符,并尝试将其放入“微秒”中。如果您确定您正在处理有效的时间戳,那么您可以通过在Steven的方法上使用变体来确实保存一些代码。 – 2011-06-01 21:43:28

3

datetime只精确到微秒。即10e-6

所以,如果你做你上面做了什么

14.078685237 

将被截断,以

14.078685 

最好在float中单独保持子秒数,然后执行一些浮点模数运算来跟踪这一点。

我觉得很可笑datetime不这样做。

对于那些说时钟不够准确的人来说。 这不是唯一的用例。当你从远处来回转换时间。 (乘以光速。) 1微秒是300米。 300米是3个足球场的长度。这是完全废话的准确性。