HOWTO · Pandas

Wie man Monat und Jahr getrennt aus der Datetime-Spalte in Pandas extrahiert

Extrahieren Sie numerische Jahres- und Monatswerte aus einer Pandas-Datetime-Spalte mit dem .dt-Accessor, oder formatieren Sie sie mit strftime() als Zeichenfolgen.

Auf dieser Seite

Mit einem datetime-Accessor einer Series lassen sich separate Spalten für Jahr und Monat ergänzen: dates.dt.year und dates.dt.month. Diese Eigenschaften liefern numerische Werte. Enthält die Ausgangsspalte Datumszeichenfolgen, wandle sie einmal mit pandas.to_datetime um, bevor du .dt verwendest. Verwende strftime(), wenn das Ergebnis Text sein soll, etwa ein Monat im Format 01.

Monat und Jahr mit Series.dt.year und Series.dt.month extrahieren

Über den .dt-Accessor sind datetime-Eigenschaften einer Pandas-Series verfügbar. Insbesondere liefern pandas.Series.dt.year und pandas.Series.dt.month Jahr und Monat als numerische Werte. Es sind Eigenschaften, keine Methoden: Füge daher keine Klammern hinzu. Die Referenz zu Series.year beschreibt die Jahreseigenschaft.

Wandle die Eingangsspalte mit pandas.to_datetime um, wenn sie Zeichenfolgen enthält. Das folgende Beispiel beginnt mit Datumszeichenfolgen im ISO-Format, wandelt die Spalte um und weist die beiden extrahierten Bestandteile zu. Anschließend gibt es den resultierenden DataFrame aus.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
df["year"] = df["joined"].dt.year
df["month"] = df["joined"].dt.month
print(df)
      joined  year  month
0 2019-11-20  2019     11
1 2020-01-02  2020      1
2 2020-02-05  2020      2

Ist eine Spalte bereits vom Typ datetime, kannst du die Umwandlungszeile überspringen und die beiden Eigenschaften direkt verwenden. Das Parsen setzt voraus, dass Pandas die Werte als Datumsangaben interpretieren kann. Bringe anders formatierte Datumszeichenfolgen vor dem Extrahieren der Bestandteile in ein passendes Format oder parse sie ausdrücklich. Die Monatseigenschaft ist numerisch: Januar wird als 1 dargestellt, was sich für Sortierungen und numerische Vergleiche eignet.

Jahr und Monat mit strftime() formatieren

Verwende strftime(), wenn nachgelagerter Code formatierte Zeichenfolgen statt numerischer Bestandteile benötigt. Mit dem Series-Accessor .dt formatiert %Y ein vierstelliges Jahr und %m einen zweistelligen Monat. Für das Datum 2020-01-02 ergeben diese Formate die Zeichenfolgen 2020 und 01.

Diese Variante verwendet dieselbe Umwandlung der Eingabewerte und fügt Textspalten hinzu. Die Monatszeichenfolge behält die führende Null, was für Beschriftungen oder Jahr-Monat-Schlüssel nützlich ist. Da es sich um Zeichenfolgen handelt, musst du sie in Zahlen umwandeln, wenn du anschließend Berechnungen oder numerische Sortierungen durchführen willst.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
df["year"] = df["joined"].dt.strftime("%Y")
df["month"] = df["joined"].dt.strftime("%m")
print(df)
      joined  year month
0 2019-11-20  2019    11
1 2020-01-02  2020    01
2 2020-02-05  2020    02

Verwende die numerischen Eigenschaften .dt.year und .dt.month, wenn du Werte für Berechnungen oder numerische Vergleiche brauchst. Verwende strftime(), wenn das Ausgabeformat wichtig ist oder ein Monat mit fester Breite wie 01 benötigt wird. Beide Ansätze arbeiten mit Werten vom Typ datetime.

Monat und Jahr mit DatetimeIndex.year und DatetimeIndex.month extrahieren

Du kannst eine datetime-Series auch in pandas.DatetimeIndex einbetten und anschließend deren Attribute year und month auslesen. Die Referenz zu DatetimeIndex beschreibt diesen Indextyp. Wie beim Series-Accessor liefern diese Attribute numerische Bestandteile, die sich in einem Schritt DataFrame-Spalten zuweisen lassen.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
dates = pd.DatetimeIndex(df["joined"])
df["year"] = dates.year
df["month"] = dates.month
print(df)
      joined  year  month
0 2019-11-20  2019     11
1 2020-01-02  2020      1
2 2020-02-05  2020      2

Verwende DatetimeIndex, wenn ein Indexobjekt zu deinem übrigen Arbeitsablauf passt. Bei einer gewöhnlichen Series-Spalte sind die Eigenschaften über .dt meist der direktere Weg. Beide Ansätze liefern numerische Werte für Jahr und Monat, während strftime() Zeichenfolgen erzeugt. Stelle in jedem Fall zuerst sicher, dass die Ausgangswerte vom Typ datetime sind. Die Beispiele verwenden Datumsangaben ohne Uhrzeit. Bei Zeitstempeln mit Zeitzonen solltest du die vorgesehene Zeitzone berücksichtigen, denn Kalenderjahr und -monat hängen vom lokalen Datum des Zeitstempels ab.