2012-10-30 136 views
4

我正在尋找快速投擲約10-20M ISO日期時間字符串與微秒精度datetime64作爲一個數據框索引在熊貓。熊貓鑄造ISO字符串datetime64

我在熊貓0.9,並嘗試了git上建議的解決方案,但我發現需要20到30分鐘,或永遠不會完成。

我想我發現了這個問題。比較這兩個速度:

rng = date_range('1/1/2000', periods=2000000, freq='ms') 
strings = [x.strftime('%Y-%m-%d %H:%M:%S.%f') for x in rng] 
timeit to_datetime(strings) 

在我的筆記本電腦上,〜300ms。

rng = date_range('1/1/2000', periods=2000000, freq='ms') 
strings = [x.strftime('%Y%m%dT%H%M%S.%f') for x in rng] 
timeit to_datetime(strings) 

在我的筆記本電腦上,永遠和一天。

我可能會更改生成時間戳的C++代碼,以便將它們放在更詳細的ISO表單中,因爲循環和固定數千萬個郵票上的格式可能相當緩慢。

回答

4

快速解析器代碼只處理帶有破折號和冒號的標準ISO-8601--正如您可以看到它在字符串格式正確時超快速。如果你可以說服這些代碼在GitHub上,並且可以改進以處理更多的情況(最好不要過分減慢標準格式)。

作爲部分滿意的解決方法,你可以使用datetime.strptime的字符串轉換爲datetime.datetime,那麼結果傳遞給to_datetime

In [4]: paste 
rng = date_range('1/1/2000', periods=2000000, freq='ms') 
strings = [x.strftime('%Y%m%dT%H%M%S.%f') for x in rng] 

## -- End pasted text -- 

In [5]: iso_strings = [x.strftime('%Y-%m-%d %H:%M:%S.%f') for x in rng] 

In [6]: %timeit result = to_datetime(iso_strings) 
1 loops, best of 3: 479 ms per loop 

In [7]: f = lambda x: datetime.strptime(x, '%Y%m%dT%H%M%S.%f') 

In [8]: f(strings[0]) 
Out[8]: datetime.datetime(2000, 1, 1, 0, 0) 

In [9]: %time result = to_datetime(map(f, strings)) 
CPU times: user 48.47 s, sys: 0.01 s, total: 48.48 s 
Wall time: 48.54 s 

這是100倍不同,但速度慢於1000 +%要好得多。我敢打賭to_datetime可以改進使用C版本的strptime,會更快。練習留給讀者,我想

待辦事項的一天:http://github.com/pydata/pandas/issues/2213

+0

剛看到這一點,謝謝!這幾乎是我最終爲一個項目做的 - 另一個我能夠將格式更改爲首選;我會看看to_datetime。 – radikalus

+1

其實本例中使用的格式不是正確的格式,合併數據和時間應該用'T'字母分隔。即使在這種情況下使用熊貓的to_datetime(),執行速度也很快。 – anddam