2017-02-10 4 views
2

を出すようなDFがいる:列「DATが」オブジェクト型を持つパンダto_datetime()関数のパフォーマンスが

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

のでI)(to_datetimeを使用して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()関数には、chuncksまたは繰り返しによって繰り返し変換する機能がありますか。

ありがとうございました。

+2

日付は一意ですか?そうでない場合は、新しい日時の値と文字列を格納するためにdictを使用することができます。その前に日付が表示されていれば変換する必要はありません。さらに、 '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 

チャンクがあると、各チャンクにdatetime関数を別々に適用できます。

0

私はちょうどこの同じ問題を自分自身に遭遇しました。優れた答えのSerialDevに感謝します。その上に構築するために、私の代わりにpd.to_datetimeのdatetime.strptimeを使用してみました:

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.5x速かったです。

関連する問題