2017-02-10 105 views
2

有一個這樣的DF:熊貓to_datetime()函數的性能問題

Dat 
10/01/2016 
11/01/2014 
12/02/2013 

列「逸」有對象類型,所以我嘗試使用to_datetime()熊貓將其切換到日期時間函數的方式:

to_datetime_rand = partial(pd.to_datetime, format='%m/%d/%Y') 
df['DAT'] = df['DAT'].apply(to_datetime_rand) 

一切正常,但我有性能問題,當我的DF高於20億行。所以在這種情況下,這種方法可能會陷入困境,並且效果不佳。

pandas to_datetime()函數是否可以通過chunck進行轉換,也可以通過循環進行迭代轉換。

謝謝。

+2

日期是唯一的嗎?如果沒有,你可以使用一個字典存儲新的日期時間值和字符串,所以它不需要轉換,如果它看到日期之前,另外任何原因,你不能只是'df ['DAT'] = pd.to_datetime (df ['DAT'],format ='%m /%d /%Y')'? – EdChum

+1

絕對不要使用'.apply' –

回答

2

如果性能是一個問題我會建議使用下面的函數來這些列轉換爲date_time

def lookup(s): 
    """ 
    This is an extremely fast approach to datetime parsing. 
    For large data, the same dates are often repeated. Rather than 
    re-parse these, we store all unique dates, parse them, and 
    use a lookup to convert all dates. 
    """ 
    dates = {date:pd.to_datetime(date) for date in s.unique()} 
    return s.apply(lambda v: dates[v]) 
to_datetime: 5799 ms 
dateutil: 5162 ms 
strptime: 1651 ms 
manual:  242 ms 
lookup:  32 ms 
+0

嘿,這是我第二次看到你非常聰明的答案。我想知道是否用另一種使用分類的算法對相同的優化概念進行了測試。我正在考慮將列轉換爲明確的標籤,並將其轉換爲日期(請參閱http://pandas.pydata.org/pandas-docs/stable/categorical.html#string-and-datetime-accessors)。如果您有機會對其進行測試並與當前的以上基準進行比較,請告訴我們。謝謝! – Boud

+0

本週末我會看看這個週末,星期二回來看看,我會添加一個修改。如果您有任何特別的注意事項,可能會發佈一個問題,我會將其添加爲書籤,並旨在正確回答。 – SerialDev

+2

這個確切的問題已經打開了一段時間,實現非常簡單:https://github.com/pandas-dev/pandas/issues/11665如果有人感興趣 – Jeff

2

你可以分割成塊的龐大數據幀分成較小的,例如這種方法可以做到這一點,你可以決定什麼是塊大小:

def splitDataFrameIntoSmaller(df, chunkSize = 10000): 
    listOfDf = list() 
    numberChunks = len(df) // chunkSize + 1 
    for i in range(numberChunks): 
     listOfDf.append(df[i*chunkSize:(i+1)*chunkSize]) 
    return listOfDf 

有了塊以後,可以分別在每個塊上應用日期時間函數。

0

我剛剛遇到同樣的問題。感謝SerialDev的出色答案。要建立對,我嘗試使用datetime.strptime代替pd.to_datetime的:

from datetime import datetime as dt 

dates = {date : dt.strptime(date, '%m/%d/%Y') for date in df['DAT'].unique()} 
df['DAT'] = df['DAT'].apply(lambda v: dates[v]) 

的strptime方法比對我來說是to_datetime方法快6.5倍。