2012-07-20 91 views
1

我必須讀一個非常大的(170萬條記錄)csv文件到一個numpy記錄數組。其中兩列是需要轉換爲日期時間對象的字符串。此外,一列需要計算這些日期之間的差異。如何有效地轉換numpy記錄數組中的日期?

目前我做了一個自定義的迭代器類,它構建了一個列表列表。然後我使用np.rec.fromrecords將其轉換爲數組。

但是,我注意到調用datetime.strptime()這麼多次真的會減慢速度。我想知道是否有更有效的方法來完成這些轉換。時間在日期範圍內精確到秒。所以,假設時間是均勻分佈的(他們不是),看起來我正在做更多20倍的必要轉換(170萬/(60 X 60 X 24)。

會更快地存儲在字典{字符串日期:日期時間OBJ}轉換值和第一查了字典,做不必要的轉換之前

或者我應該使用numpy的功能(我還是新來的numpy的庫)

+0

你能告訴我們在csv文件中使用什麼日期格式嗎?我會假設'fromfunction()'可以在這裏幫助,但我需要稍微更多的信息。 – Wolph 2012-07-20 18:51:54

+0

19-JUL-12 02.05.53 PM – 2012-07-20 19:05:51

+0

如果所有這些都在一天之內,應該很容易使轉換變得更簡單。你只需要解析一次日期。在這之後,您只需將這樣的秒數轉換爲:'lambda x:int(x [-11:-9])* 3600 + int(x [-8:-6])* 60 + int(x [-5: - 3])' – Wolph 2012-07-20 19:12:20

回答

0

我?可能是錯誤的,但在我看來你的問題是重複發生,因此做了相同的轉換次數超過必要的IF解釋是正確的,t他最有效的方法將取決於有多少重複。如果在170萬次中有10萬次重複,那麼將160萬次寫入字典並檢查170萬次可能效率更高,因爲它的讀取/寫入次數爲1.6 + 1.7百萬次。但是,如果您有一百萬次重複,那麼爲這些人返回一個答案(O(1)),而不是進行額外百萬倍的轉換會快得多。

總而言之,雖然python非常慢,並且根據您使用的170萬個輸入,您可能無法加速這一切。至於numpy函數,我也不是很精通,但我相信在線有一些很好的文檔。

+0

日期(精確到秒)僅在1天內存在。因此最多有86,400個日期。目前該應用程序正在進行340萬次轉換。我承認字典方法幾乎肯定會加快它的速度。我主要是諮詢堆棧,看看他們是否有其他方式,我沒有想到(或在numpy的東西)。 – 2012-07-20 19:03:47

+0

唉好的我明白了,在這種情況下,我會同意,IMO,字典是最快的方法。我懷疑numpy是否有辦法做到這一點,並且可能有非常複雜的方法可以給出更好的結果,但考慮到所有因素,字典可能是最好的。 – Adam 2012-07-23 13:53:11

相關問題