Diese Frage wurde bereits ausreichend beantwortet, aber ich wollte die Ergebnisse einiger Tests hinzufügen, die ich ausgeführt habe, um meinen eigenen Code zu optimieren.
Ich bekam dieses Format von einer API: "Mi Feb 08 17:58:56 +0000 2017".
Mit dem Standard pd.to_datetime(SERIES)
mit einer impliziten Konvertierung dauerte es über eine Stunde, um etwa 20 Millionen Zeilen zu verarbeiten (abhängig davon, wieviel freier Speicher ich hatte).
Das heißt, ich drei verschiedene Umwandlungen getestet:
# sample of 250k rows
dt_series_sample = df['created_at'][:250000]
%timeit format_datetime_1(dt_series_sample)
%timeit format_datetime_2(dt_series_sample)
%timeit format_datetime_3(dt_series_sample)
%timeit format_datetime_baseline(dt_series_sample)
1 loop, best of 3: 1.56 s per loop
1 loop, best of 3: 2.09 s per loop
1 loop, best of 3: 1.72 s per loop
1 loop, best of 3: 1min 9s per loop
Die ersten Testergebnisse in einer erstaunlichen 97,7% Laufzeitreduktion:
# explicit conversion of essential information only -- parse dt str: concat
def format_datetime_1(dt_series):
def get_split_date(strdt):
split_date = strdt.split()
str_date = split_date[1] + ' ' + split_date[2] + ' ' + split_date[5] + ' ' + split_date[3]
return str_date
dt_series = pd.to_datetime(dt_series.apply(lambda x: get_split_date(x)), format = '%b %d %Y %H:%M:%S')
return dt_series
# explicit conversion of what datetime considers "essential date representation" -- parse dt str: del then join
def format_datetime_2(dt_series):
def get_split_date(strdt):
split_date = strdt.split()
del split_date[4]
str_date = ' '.join(str(s) for s in split_date)
return str_date
dt_series = pd.to_datetime(dt_series.apply(lambda x: get_split_date(x)), format = '%c')
return dt_series
# explicit conversion of what datetime considers "essential date representation" -- parse dt str: concat
def format_datetime_3(dt_series):
def get_split_date(strdt):
split_date = strdt.split()
str_date = split_date[0] + ' ' + split_date[1] + ' ' + split_date[2] + ' ' + split_date[3] + ' ' + split_date[5]
return str_date
dt_series = pd.to_datetime(dt_series.apply(lambda x: get_split_date(x)), format = '%c')
return dt_series
# implicit conversion
def format_datetime_baseline(dt_series):
return pd.to_datetime(dt_series)
Das sind die Ergebnisse war!
Etwas überraschend sieht es sogar so aus, als würde selbst die "angemessene Darstellung" länger dauern, wahrscheinlich weil sie halbimplizit ist.
Fazit: je expliziter Sie sind, desto schneller wird es laufen.
'infer_datetime_format = True' ist langsamer, die Ergebnisse sind' 1000 loops, best of 3: 908 μs pro Schleife'. Gibt es eine schnellere Möglichkeit, nicht standardmäßige Zeitzeichenfolgen in datetime zu konvertieren? – liubenyuan
Das liegt daran, dass Sie eine einzelne Zeichenfolge zeitlich festlegen. Wenn Sie es für eine größere Serie tun, werden Sie die Beschleunigung sehen. – joris
Und wie gesagt, es gibt * einen schnelleren Weg, den du selbst benutzt hast in der Frage: stelle einen 'format' String zur Verfügung. – joris