Das korrekte Festlegen von format=
ist viel schneller als pandas herausfinden zu lassen1
Long story short, das richtige Übergeben von format=
von Anfang an, wie in chrisb's Beitrag, ist viel schneller als pandas das Format herausfinden zu lassen, insbesondere wenn das Format eine Zeitkomponente enthält. Der Laufzeitunterschied für Dataframes mit mehr als 10k Zeilen ist riesig (~25 Mal schneller, also reden wir hier von ein paar Minuten gegen ein paar Sekunden). Alle gültigen Formatoptionen finden Sie unter https://strftime.org/.
![perfplot]()
errors='coerce'
ist nützlich
Wenn einige Zeilen nicht im richtigen Format sind oder überhaupt keine Datumszeiten sind, ist der Parameter errors=
sehr nützlich, damit Sie die gültigen Zeilen konvertieren können und später die Zeilen bearbeiten können, die ungültige Werte enthielten.
df['date'] = pd.to_datetime(
df['date'], format='%d%b%Y:%H:%M:%S.%f', errors='coerce')
# für mehrere Spalten
df[['start', 'end']] = df[['start', 'end']].apply(
pd.to_datetime, format='%d%b%Y:%H:%M:%S.%f', errors='coerce')
Um die SettingWithCopyWarning
zu unterdrücken
Übrigens, wenn Sie diese Warnung erhalten, bedeutet das wahrscheinlich, dass Ihr Dataframe wahrscheinlich durch Filtern eines anderen Dataframes erstellt wurde. Aktivieren Sie Copy-on-Write und Sie sind bereit (siehe diesen Beitrag für weitere Informationen).
pd.set_option('copy_on_write', True)
df['date'] = pd.to_datetime(df['date'], format='%d%b%Y:%H:%M:%S.%f')
1 Code verwendet, um das Zeitit-Testdiagramm zu erstellen.
import perfplot
from random import choices
from datetime import datetime
mdYHMSf = range(1,13), range(1,29), range(2000,2024), range(24), *[range(60)]*2, range(1000)
perfplot.show(
kernels=[lambda x: pd.to_datetime(x),
lambda x: pd.to_datetime(x, format='%m/%d/%Y %H:%M:%S.%f'),
lambda x: pd.to_datetime(x, infer_datetime_format=True),
lambda s: s.apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))],
labels=["pd.to_datetime(df['date'])",
"pd.to_datetime(df['date'], format='%m/%d/%Y %H:%M:%S.%f')",
"pd.to_datetime(df['date'], infer_datetime_format=True)",
"df['date'].apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))"],
n_range=[2**k for k in range(20)],
setup=lambda n: pd.Series([f"{m}/{d}/{Y} {H}:{M}:{S}.{f}"
for m,d,Y,H,M,S,f in zip(*[choices(e, k=n) for e in mdYHMSf])]),
equality_check=pd.Series.equals,
xlabel='len(df)'
)
Wenn die Spalte mehrere Formate enthält, siehe Convert a column of mixed format strings to a datetime Dtype.