484 Stimmen

Konvertiere Pandas-Spalte in Datum und Uhrzeit

Ich habe ein Feld in einem Pandas DataFrame, das im String-Format importiert wurde.

Es sollte eine Datumszeitvariable sein. Wie konvertiere ich sie in eine Datumszeitspalte und filtere dann nach Datum?

Beispiel:

raw_data = pd.DataFrame({'Mycol': ['05SEP2014:00:00:00.000']})

10voto

not a robot Punkte 3525
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.

-2voto

Amar nayak Punkte 147

Genau wie wir den Objekt-Datentyp in float oder int umwandeln, verwenden wir astype().

raw_data['Mycol'] = raw_data['Mycol'].astype('datetime64[ns]')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X