Erklärung
Vorwissen: Datenimport, weil die Umwandlung dorthin gehört, und Data Wrangling für das Gruppieren nach Zeitabschnitten. Für Reihen, bei denen die Reihenfolge selbst Information trägt, siehe Zeitreihen.
Die Typen
| Datum ohne Zeit |
Date |
datetime64[ns], Timestamp |
| Zeitpunkt |
POSIXct |
Timestamp mit tz |
| Differenz |
difftime |
Timedelta |
| Kalenderabschnitt |
floor_date() auf Monat, Woche |
Period, to_period("M") |
Gruppieren nach Zeitabschnitten
Für eine Auswertung je Monat gibt es zwei Wege, und nur einer ist richtig:
Monatsname oder %m als Text |
“01”, “Januar” |
nein, das Jahr fehlt |
| auf den Monatsanfang abrunden |
2026-01-01 |
ja |
| Periode |
2026-01 |
ja |
Dasselbe gilt für Wochen. Dort kommt hinzu, dass die ISO-Woche zum Jahreswechsel zu einem anderen Jahr gehören kann als das Datum: Der 1. Januar 2027 liegt in der ISO-Woche 53 des Jahres 2026. Wer nur nach der Wochennummer gruppiert, wirft zwei Jahre zusammen; richtig ist das Paar aus ISO-Jahr und ISO-Woche.
Rechnen
+ days(30) addiert 30 Tage, %m+% months(1) beziehungsweise DateOffset(months=1) addiert einen Monat, und ein Monat ist je nach Monat 28 bis 31 Tage lang. Beim Monatsende kommt hinzu, dass es den Zieltag nicht geben muss: der 31. Januar plus ein Monat. R liefert mit dem gewöhnlichen + months(1) dafür NA, mit %m+% den letzten Tag des Zielmonats; pandas nimmt mit DateOffset ebenfalls den letzten Tag.
Zeitzonen
| umwandeln |
with_tz() |
tz_convert() |
derselbe Moment, andere Darstellung |
| festlegen |
force_tz() |
tz_localize() |
anderer Moment, gleiche Ziffern |
Zwei Regeln vermeiden die meisten Probleme: intern in UTC speichern und rechnen, erst für die Ausgabe umwandeln. Die Sommerzeit macht zusätzlich zwei Dinge kaputt: Im Frühling gibt es eine Ortszeit, die nicht existiert, im Herbst eine, die zweimal vorkommt.
Kurz nachgeschlagen
| Text zu Datum |
dmy(x), ymd_hms(x) |
pd.to_datetime(x, format="%d.%m.%Y") |
| beim Import |
col_date(format = "%d.%m.%Y") |
parse_dates=["datum"], dayfirst=True |
| Bestandteile |
year(), month(), day(), wday() |
.dt.year, .dt.month, .dt.day_name() |
| auf Monat runden |
floor_date(d, "month") |
.dt.to_period("M") |
| ISO-Woche |
isoweek(), isoyear() |
.dt.isocalendar().week und .year |
| Differenz in Tagen |
as.numeric(b - a, units = "days") |
(b - a).days |
| Monat addieren |
d %m+% months(1) |
d + pd.DateOffset(months=1) |
| Zeitachse erzeugen |
seq(von, bis, by = "day") |
pd.date_range(von, bis, freq="D") |
| Zone umwandeln |
with_tz(t, "Europe/Zurich") |
t.tz_convert("Europe/Zurich") |