2017-02-10 3 views
2

Haben Sie einen df wie folgt aus:Pandas to_datetime() Funktion Performance-Probleme

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

Die Spalte 'Dat' Objekttyp hat, damit ich versuchen, es zu Datetime wechseln to_datetime() verwendet Pandas Funktion, die Art und Weise:

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

Alles funktioniert gut, aber ich habe Leistungsprobleme, wenn mein df höher als 2 Milliarden Zeilen ist. In diesem Fall bleibt diese Methode hängen und funktioniert nicht gut.

Funktioniert die pandas to_datetime() - Funktion mit der Möglichkeit, die Konvertierung durch Chuncks oder iterativ durch Schleifen durchzuführen.

Danke.

+2

Sind die Daten eindeutig? Wenn nicht, könnten Sie ein dict verwenden, um die neuen datetime-Werte und Strings zu speichern, so dass es nicht konvertiert werden muss, wenn es das Datum vorher gesehen hat, zusätzlich einen Grund, warum Sie nicht einfach 'df ['DAT'] = pd.to_datetime tun können (df ​​['DAT'], Format = '% m /% d /% Y') '? – EdChum

+1

Definitiv nicht verwenden '.apply' –

Antwort

2

Wenn die Leistung ist ein Anliegen, ich würde Ihnen raten, die folgende Funktion zu verwenden, um diese Spalten zu date_time konvertieren:

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

Hey, das ist das zweite Mal, dass ich Ihre sehr schlaue Antwort sehe. Ich habe mich gefragt, ob Sie Tests um das gleiche Optimierungskonzept mit einem anderen Algorithmus unter Verwendung von kategorischen Tests durchgeführt haben. Ich habe darüber nachgedacht, die Spalte zu kategorisieren, wobei die Labels in Daten umgewandelt werden (siehe http://pandas.pydata.org/pandas-docs/stable/categorical.html#string-and-datetime-accessors). Lassen Sie es mich wissen, wenn Sie eine Chance haben, es zu testen und mit Ihrem aktuellen Benchmark zu vergleichen. Vielen Dank! – Boud

+0

Ich werde dieses Wochenende mal schauen, am Dienstag checken und ich werde eine Bearbeitung hinzufügen. Wenn Sie besondere Vorbehalte haben, schreiben Sie vielleicht eine Frage und ich werde sie mit einem Lesezeichen versehen und darauf zielen, angemessen zu antworten. – SerialDev

+2

Dieses genaue Problem ist seit einiger Zeit offen und die Implementierung ist ziemlich einfach: https://github.com/pandas-dev/pandas/issues/11665 wenn jemand interessiert ist – Jeff

2

Sie in Stücke Ihre riesigen Datenrahmen in kleinere aufspalten könnte, zum Beispiel kann diese Methode es tun, wo Sie entscheiden können, was die Chunk-Größe ist:

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 

Nachdem Sie Chunks haben, können Sie die Datetime-Funktion für jeden Chunk separat anwenden.

0

Ich bin gerade selbst auf dasselbe Problem gestoßen. Danke an SerialDev für die ausgezeichnete Antwort. Um darauf zu aufbauen, habe ich versucht, datetime.strptime statt pd.to_datetime mit:

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]) 

Die strptime Methode war 6,5x schneller als die to_datetime Methode für mich.

Verwandte Themen