2011-06-01 83 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個足球場的長度。這是完全廢話的準確性。