Datumsangaben und Zeitreihen mit pandas
MittelEinheit 6 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib
Was du lernst
- Zeitpunkte und Zeitdauern in den Datums- und Zeittypen von pandas speichern, Datumsangaben aus Text einlesen, ohne Tag und Monat zu verwechseln, und Kalenderkomponenten wie Monat und Wochentag auslesen.
- Mit Zeitstempeln, Zeitdauern und Kalenderkomponenten arbeitenTimestamp, Timedelta und den Datentyp datetime64 nutzen, die Zeit zwischen Ereignissen berechnen und mit dem
.dt-Accessor Komponenten wie Jahr, Stunde und Wochentag auslesen. - Datumsangaben aus Text einlesen und für die Ausgabe formatierenText und Zahlen mit
pd.to_datetimein Datums- und Zeitwerte umwandeln, Formate so wählen, dass Tag und Monat nicht vertauscht werden, mit nicht einlesbaren Werten umgehen und Datums- und Zeitwerte wieder in lesbaren Text umwandeln.
- Mit Zeitstempeln, Zeitdauern und Kalenderkomponenten arbeiten
- Einen bereinigten, sortierten Zeitindex erstellen, damit beliebige Tage, Monate oder Zeitfenster auswählen und jeden Wert mit früheren Werten vergleichen.
- Einen Zeitindex erstellen und prüfenEine Datums- und Zeitspalte in einen sortierten DatetimeIndex umwandeln, doppelte Zeitstempel behandeln sowie Lücken und die Frequenz einer Zeitreihe ermitteln.
- Zeilen nach Datum und Tageszeit auswählenGanze Jahre, Monate, Tage und Zeiträume mit Datumszeichenketten auswählen, nach Wochentag oder Uhrzeit filtern und Fehler vermeiden, die falsche Zeilen zurückgeben.
- Werte im Zeitverlauf anhand von Verschiebungen, Differenzen und prozentualen Änderungen vergleichenWerte verzögern und vorziehen, Änderungen und Wachstumsraten berechnen und verstehen, wie pandas zwei Zeitreihen anhand des Datums ausrichtet.
- Einen Zeitindex erstellen und prüfen
- Regelmäßige Datumsfolgen erstellen, Datumswerte nach Kalenderregeln wie „einen Monat später“ oder „nächster Geschäftstag“ verschieben und mit ganzen Monaten, Quartalen und Geschäftsjahren als Perioden arbeiten.
- Regelmäßige Datumsfolgen mit Frequenzkürzeln erstellenMit
pd.date_rangeFolgen von Datums- und Zeitwerten erzeugen, das passende Frequenzkürzel wählen und das erste und letzte Datum korrekt festlegen. - Datumswerte mit kalenderbezogenen Offsets verschiebenFeste Zeitdauern von Kalenderregeln unterscheiden und DateOffset, Monatsende-, Geschäftstags- und andere Offsets nutzen, um Datumswerte korrekt zu verschieben.
- Mit ganzen Monaten, Quartalen und Geschäftsjahren als Perioden arbeitenZeitspannen mit Period und PeriodIndex darstellen, zwischen Zeitstempeln und Perioden umwandeln und mit Quartalen eines Geschäftsjahres arbeiten.
- Regelmäßige Datumsfolgen mit Frequenzkürzeln erstellen
- Detaillierte Daten zu Tages-, Wochen-, Monats- oder Quartalssummen und -mittelwerten aggregieren, ein feineres Zeitraster auffüllen und mehrere Zeitreihen gleichzeitig durch Resampling umwandeln.
- Zeitreihen durch Downsampling zu Summen, Mittelwerten und anderen Kennwerten verdichtenDaten mit
resamplein gröbere Zeitintervalle aggregieren, die passende Aggregation wählen und Intervallgrenzen und -bezeichnungen richtig lesen. - Eine Zeitreihe durch Upsampling verfeinern und Lücken füllenDaten auf ein feineres Zeitraster übertragen, neue Stellen durch Vorwärts- oder Rückwärtsauffüllen oder Interpolation füllen und fehlende Datumswerte sichtbar machen.
- Mehrere Zeitreihen gruppenweise gleichzeitig durch Resampling umwandelnEine lange Tabelle mit vielen Geschäften, Sensoren oder Kunden gruppenweise durch Resampling umwandeln und das Ergebnis für den Vergleich umformen.
- Zeitreihen durch Downsampling zu Summen, Mittelwerten und anderen Kennwerten verdichten
- Gleitende Mittelwerte und andere Fensterkennwerte über eine Anzahl von Zeilen oder eine Zeitspanne sowie kumulative Summen und gewichtete Mittelwerte über den gesamten bisherigen Verlauf berechnen.
- Gleitende Kennwerte über eine feste Anzahl von Zeilen berechnen
rolling(n)für gleitende Mittelwerte, Summen und andere Kennwerte nutzen, unvollständige Fenster steuern und Fenster gruppenweise anwenden. - Zeitbasierte Fenster für unregelmäßig erfasste Daten nutzenFenster durch eine Zeitspanne wie „7D“ definieren, verstehen, welche Beobachtungen jedes Fenster einschließt, und zwischen zeilenbasierten und zeitbasierten Fenstern wählen.
- Kumulative Summen, kumulative Maxima und exponentiell gewichtete Mittelwerte verfolgenWachsende Fenster für kumulative Kennwerte und Drawdowns sowie exponentiell gewichtete Mittelwerte nutzen, die neuere Werte stärker gewichten.
- Gleitende Kennwerte über eine feste Anzahl von Zeilen berechnen
- Zeitstempeln die richtige Zeitzone zuordnen, zwischen Zeitzonen umrechnen, Daten aus verschiedenen Zeitzonen kombinieren und Stunden berücksichtigen, die bei der Sommerzeitumstellung übersprungen oder wiederholt werden.
- Zeitstempeln Zeitzonen zuordnen und zwischen Zeitzonen umrechnenZeitstempel ohne und mit Zeitzoneninformation unterscheiden, mit
tz_localizeeine Zeitzone zuordnen, mittz_convertumrechnen und Daten aus verschiedenen Zeitzonen kombinieren. - Sommerzeit in Zeitreihen berücksichtigenÜbersprungene und wiederholte Ortszeiten erkennen, bewusst lokalisieren und an Tagen mit 23 oder 25 Stunden korrektes Resampling und korrekte Verschiebungen durchführen.
- Zeitstempeln Zeitzonen zuordnen und zwischen Zeitzonen umrechnen
Zeitreihen mit pandas einfach erklärt
1Datums- und Zeitangaben in Werte umwandeln, mit denen du in pandas rechnen kannst
Datumsangaben liegen als Zeichenketten, Zahlen und Uhrzeiten vor, für die Analyse braucht es aber eine einheitliche Darstellung. Lerne, diese Eingaben in Zeitpunkte und Zeitdauern umzuwandeln, fehlgeschlagene Umwandlungen zu prüfen und nützliche Kalenderkomponenten auszulesen. Die Beispiele unterscheiden zwischen einem gespeicherten Datums- und Zeitwert und seinem Anzeigetext, sodass späteres Sortieren, Auswählen und Rechnen die Kalenderbedeutung berücksichtigt. Kleine Details wie Formatcodes für Monat und Minute und die Speicherauflösung können ein Ergebnis erheblich verändern.
1.1 Mit Zeitstempeln, Zeitdauern und Kalenderkomponenten arbeiten
Ein Datumswert ist nützlicher, wenn pandas ihn als solchen erkennt. Eine Zeitreihe verknüpft Beobachtungen mit Zeitpunkten oder Zeitspannen. Stündliche Energiemesswerte bilden eine regelmäßige Zeitreihe; Bestellungen in ungleichmäßigen Abständen eine unregelmäßige. Text wie „12/31/2024“ kann nach „03/01/2025“ einsortiert werden, obwohl der Dezember früher war. Einheitliche vollständige ISO-Zeichenketten lassen sich korrekt sortieren, doch Datums- und Zeitwerte ermöglichen zusätzlich die Auswahl nach Kalenderangaben und Rechnungen.
Das passende Zeitobjekt wählen
Python stellt datetime, date und timedelta bereit. In pandas enthält ein Timestamp einen Zeitpunkt, eine Datums- und Zeitspalte hat einen Datentyp datetime64[unit] und ein DatetimeIndex enthält Datums- und Zeitwerte als Zeilenbezeichnungen. NaT bezeichnet eine fehlende Zeitangabe. Mit pd.isna() erkennst du sie; die Subtraktion einer fehlenden Zeitangabe ergibt wieder einen fehlenden Wert.
Die Einheit in datetime64[us] sind Mikrosekunden, die Speicherauflösung. Zu den weiteren Einheiten gehören Sekunden (s), Millisekunden (ms) und Nanosekunden (ns). pandas 3 liest Text normalerweise mit Mikrosekundenauflösung ein und verwendet Nanosekunden, wenn der Text sie benötigt. Eine feinere Auflösung beansprucht mehr vom Wertebereich der Ganzzahlen: Datumswerte in Nanosekunden reichen nur von 1677 bis 2262.
Verstrichene Zeit berechnen
import pandas as pd
start = pd.Timestamp("2025-03-10 18:00")
end = pd.Timestamp("2025-03-14 09:30")
elapsed = end - start
hours = elapsed / pd.Timedelta(hours=1)
elapsed beträgt 3 Tage, 15 Stunden und 30 Minuten. Die drei Tage entsprechen 72 Stunden, also ist hours gleich 87,5. elapsed.total_seconds() ergibt 315.000. Das Attribut .days ergibt nur 3; es ist der Anteil ganzer Tage, nicht die vollständige Dauer in Tagen. Erstelle Zeitdauern mit pd.Timedelta(hours=36) oder lies mehrere mit pd.to_timedelta(["1h", "90min"]) ein.
Die Subtraktion eines Zeitstempels von einer ganzen Datums- und Zeitspalte ergibt zeilenweise Zeitdauern. Verwende .dt.days für die Anteile ganzer Tage oder dividiere die Zeitdauerspalte durch ein Timedelta mit der gewünschten Einheit, um vollständige Werte mit Bruchteilen zu erhalten.
Kalenderkomponenten auslesen und Zeiten runden
In einer Spalte lesen .dt.year, .dt.month, .dt.hour und .dt.quarter Kalenderkomponenten aus. .dt.day_of_week nummeriert Montag mit 0 bis Sonntag mit 6; .dt.day_name() gibt einen Namen zurück. Der 14. März 2025 ist ein Freitag mit der Nummer 4. Bei einem Index greifst du direkt auf diese Attribute zu: df.index.month. Die Schreibweisen day_of_week und day_of_year ersetzen ältere, in pandas 3.1 als veraltet markierte Schreibweisen.
Ein Wochentag kann zum Gruppierungsschlüssel werden: df.groupby(df["timestamp"].dt.day_name())["kwh"].mean(). Eine Gruppierung nach Monatsnummer fasst diesen Monat über mehrere Jahre zusammen; eine Monatsperiode hält die Jahre getrennt.
Für 09:37 Uhr ergibt .dt.floor("h") 09:00 Uhr, .dt.ceil("h") 10:00 Uhr und .dt.round("15min") 09:30 Uhr. .dt.normalize() setzt die Uhrzeiten auf Mitternacht und behält Datums- und Zeitwerte bei. .dt.date erzeugt stattdessen Python-Datumsobjekte und verliert die Funktionen einer Datums- und Zeitspalte.
Zahleneinheiten ausdrücklich festlegen
astype("int64") gibt die Anzahl in der Einheit der jeweiligen Spalte zurück. Die Anzahl in Mikrosekunden ist für denselben Zeitpunkt um den Faktor 1.000 kleiner als die Anzahl in Nanosekunden. Benötigt eine externe Rechnung Nanosekunden, verwende s.dt.as_unit("ns").astype("int64"); ein Timestamp oder Index verwendet direkt .as_unit("ns"). Für verstrichene Zeit vermeiden Timedelta-Rechnungen diese Einheitenfalle.
Wichtige Erkenntnisse
- Ein Timestamp ist ein Zeitpunkt; ein Timedelta ist eine verstrichene Zeitdauer.
- Verwende Timedeltas mit einer Einheit, um vollständige Zeitdauern einschließlich Bruchteilen zu erhalten.
- Kalenderattribute werden bei Spalten über
.dtund bei Indizes direkt aufgerufen. - Fehlende Zeitangaben sind
NaT. - Ganzzahlige Datums- und Zeitzählwerte hängen von der Speicherauflösung ab.
1.2 Datumsangaben aus Text einlesen und für die Ausgabe formatieren
Beim Einlesen erhält Text eine Kalenderbedeutung. Kläre vor der Umwandlung einer Datumsspalte ihr Format und prüfe, ob sie Zeitverschiebungen, ungültige Einträge oder fehlende Werte enthält. ISO 8601 schreibt das Jahr zuerst, wie in „2025-03-14T09:30:00“, und vermeidet die Mehrdeutigkeit von Tag und Monat.
Das Quellformat angeben
„03/04/2025“ kann den 4. März oder den 3. April bedeuten. pd.to_datetime("03/04/2025") liest den Monat zuerst; dayfirst=True liest den Tag zuerst. Ein bekanntes Format ist eindeutiger:
raw = pd.Series(["14/03/2025 18:45", "15/03/2025 09:00"])
parsed = pd.to_datetime(raw, format="%d/%m/%Y %H:%M")
%Y steht für ein vierstelliges Jahr, %m für einen Monat und %d für einen Tag. %H bezeichnet eine Stunde im 24-Stunden-Format, %M eine Minute und %S eine Sekunde. Verwende %I mit %p für das 12-Stunden-Format und AM/PM. %b und %B lesen abgekürzte und ausgeschriebene Monatsnamen. Das große %M bedeutet Minuten und kann daher das kleine %m für Monate nicht ersetzen.
Ohne format ermittelt pandas ein Format anhand des ersten nicht fehlenden Eintrags und wendet es auf die Spalte an. Steht „03/04/2025“ zuerst, schlägt ein späteres „13/04/2025“ fehl, wenn der Monat an erster Stelle angenommen wird. Eine andere Reihenfolge der Zeilen kann das ermittelte Format ändern. format="ISO8601" verarbeitet ISO-Varianten. format="mixed" liest Einträge einzeln ein, kann aber eine mehrdeutige Konvention der Quelle nicht klären; bereinige oder prüfe diese Konvention zuerst.
Fehlgeschlagene Umwandlungen prüfen
raw = pd.Series(["2025-01-15", "not a date", None])
parsed = pd.to_datetime(raw, format="%Y-%m-%d", errors="coerce")
failed = parsed.isna() & raw.notna()
Das Ergebnis enthält den 15. Januar und zwei NaT-Werte. parsed.isna().sum() ist 2, weil der ursprünglich fehlende Eintrag mitgezählt wird. failed.sum() ist 1, weil nur „not a date“ vorhanden war und nicht eingelesen werden konnte. Prüfe raw[failed], bevor du entscheidest, ob du den Eintrag korrigierst oder entfernst. Die Fehlerersetzung lässt das Laden weiterlaufen, verbirgt aber auch Tippfehler wie einen unmöglichen Monat. Die Standardeinstellung errors="raise" stoppt bei ungültigen Eingaben; pandas 3 hat errors="ignore" entfernt.
Dateien und numerische Zeitstempel einlesen
pd.read_csv("meter.csv", parse_dates=["timestamp"], index_col="timestamp") fordert das Einlesen als Datums- und Zeitwerte und einen Zeitindex an. Prüfe nach dem Laden die entstandenen Datentypen. Textspalten verwenden in pandas 3 den Datentyp str; ältere Versionen zeigen häufig object an.
Verbinde getrennte Datums- und Zeitzeichenketten vor dem Einlesen mit einem Leerzeichen. Spalten mit den Namen year, month und day lassen sich direkt mit pd.to_datetime(df[["year", "month", "day"]]) zusammensetzen.
Gib bei Unix-Zählwerten die Einheit an. pd.to_datetime(1735689600, unit="s", utc=True) ergibt Mitternacht UTC am 1. Januar 2025. Die Anzahl in Millisekunden lautet 1735689600000 mit unit="ms". Eine falsche Einheit verändert den interpretierten Zeitpunkt.
Nur für die Darstellung formatieren
parsed.dt.strftime("%d %b %Y") schreibt Text wie „15 Jan 2025“. Die Methode .isoformat() eines Timestamps schreibt eine ISO-Zeichenkette. Monats- und Wochentagsnamen richten sich nach der Spracheinstellung des Systems; die angezeigten Beispiele verwenden Englisch. Behalte Datums- und Zeitwerte während der Analyse bei und formatiere sie beim Export, denn Zeichenketten unterstützen keine Datumsrechnungen mehr.
Wichtige Erkenntnisse
- Bevorzuge eindeutige ISO-Datumsangaben, wenn du die Quelle bestimmen kannst.
- Gib ein bekanntes Einleseformat ausdrücklich an.
- Unterscheide ungültige Eingaben von bereits fehlenden Werten.
- Ordne Unix-Zählwerten die passende Einheit Sekunden oder Millisekunden zu.
- Formatiere erst am Ende der Analyse als Text.
%mbedeutet Monat;%Mbedeutet Minute.
2Daten nach Zeit indizieren, auswählen und vergleichen
Ein Zeitindex macht Datumsangaben als Zeilenbezeichnungen nutzbar. Vor einem Vergleich müssen die Bezeichnungen aber sorgfältig geprüft werden. Sortiere Beobachtungen, entscheide, was doppelte Zeitstempel bedeuten, und mache fehlende Datumsangaben sichtbar. Wähle dann Kalenderperioden oder wiederkehrende Tageszeitfenster aus und vergleiche Werte mit früheren Werten. Entscheidend ist der Unterschied zwischen Zeilenposition und tatsächlicher Zeit: Eine vorherige Zeile kann mehrere Tage zurückliegen, und zwei Zeitreihen werden anhand übereinstimmender Zeitstempel kombiniert.
2.1 Einen Zeitindex erstellen und prüfen
Ein brauchbarer Zeitindex ist eingelesen, geordnet und geprüft. Eine Tabelle kann mehrere Ereignisse zu einem Zeitpunkt, fehlende Tage oder ungeordnete Datenblöcke enthalten. Jede dieser Bedingungen verändert die Bedeutung späterer Berechnungen.
Datums- und Zeitwerte als Zeilenbezeichnungen erstellen
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d %H:%M")
df = df.set_index("timestamp").sort_index()
set_index() verschiebt die Spalte in die Zeilenbezeichnungen; es liest keinen Text ein. Prüfe df.index.dtype auf einen Datums- und Zeittyp und df.index.is_monotonic_increasing auf chronologische Reihenfolge. Gleiche benachbarte Zeiten sind in einem steigenden Index zulässig, daher belegt diese Prüfung keine Eindeutigkeit.
Ein DatetimeIndex unterstützt die Auswahl nach Datum und Resampling. Textbezeichnungen werden nicht allein deshalb zu einem Zeitindex, weil sie wie Datumsangaben aussehen. Du kannst Zeitstempel auch in einer Spalte belassen: df.resample("D", on="timestamp") nutzt diese Spalte, ohne den Index zu ändern. Ein PeriodIndex ist eine weitere Darstellung für Zeitreihen, deren Zeilen Zeitspannen wie Monate beschreiben.
Entscheiden, was wiederholte Zeiten bedeuten
df.index.is_unique gibt an, ob jede Bezeichnung unterschiedlich ist. df.index.duplicated() markiert wiederholte Bezeichnungen nach dem ersten Auftreten. Angenommen, zwei Messwerte, 3 und 5, gehören zum 1. Januar und ein Messwert von 4 zum 2. Januar. Die Mittelwertbildung für doppelte Messwerte mit df.groupby(level=0).mean() ergibt an beiden Daten 4,0.
Diese Operation ist eine Entscheidung über die Daten. Stellen die Zeilen separate Käufe dar, kann Summieren angemessen sein. Hat ein Import einen Datensatz verdoppelt, kann es angemessen sein, mit df[~df.index.duplicated(keep="last")] die letzte Kopie zu behalten. Lösche keine gültigen Transaktionen allein deshalb, um einen eindeutigen Index zu erhalten. Operationen, die jeder Zielbezeichnung einen Wert zuordnen, darunter reindex() und asfreq(), benötigen eindeutige Quellbezeichnungen.
Gespeicherte und ermittelte Frequenz unterscheiden
Ein mit pd.date_range() erstellter Index trägt normalerweise .freq. Bei eingelesenen Zeitstempeln ist .freq häufig gleich None, selbst wenn sie auf aufeinanderfolgende Tage fallen. pd.infer_freq(df.index) untersucht mindestens drei Zeitstempel und gibt ein Kürzel wie „D“ oder „ME“ zurück, wenn es ein regelmäßiges Muster findet. Unregelmäßige Abstände ergeben None.
Frequenzmetadaten ersetzen keine Vollständigkeitsprüfung. Um fehlende tägliche Zeilen zu finden, erstelle den erwarteten Kalender:
calendar = pd.date_range(df.index.min(), df.index.max(), freq="D")
missing = calendar.difference(df.index)
Ein fehlender Tag hat keine Zeile. Er unterscheidet sich von einer vorhandenen Zeile mit NaN. Ein Kalender, der durch das beobachtete Minimum und Maximum begrenzt ist, kann keine fehlenden Daten außerhalb dieses Bereichs aufdecken; verwende den geplanten Beginn und das geplante Ende des Berichtszeitraums, wenn sie bekannt sind.
Auf spätere Operationen vorbereiten
Sortieren macht Slices vorhersehbar und ist für zeitbasierte gleitende Fenster erforderlich. Fehlende Zeilen sind auch dann relevant, wenn eine Berechnung gelingt: shift(1) bedeutet eine Zeile zurück und rolling(7) bedeutet sieben Zeilen. Keine der beiden Methoden prüft, ob jede Zeile einen Tag darstellt. Behalte bei einer langen Tabelle außerdem den Schlüssel der Zeitreihe, etwa Sensor oder Geschäft, damit spätere Operationen getrennt je Zeitreihe ausgeführt werden können.
Wichtige Erkenntnisse
- Lies Datumsangaben ein, bevor du den Zeitindex setzt, und sortiere ihn.
- Prüfe Reihenfolge und Eindeutigkeit getrennt.
- Behandle doppelte Bezeichnungen entsprechend der Bedeutung ihrer Zeilen.
- Vergleiche mit einem vollständigen Kalender, um fehlende Datumsangaben zu finden.
2.2 Zeilen nach Datum und Tageszeit auswählen
Sobald der Index sortierte Datums- und Zeitwerte enthält, sind Datumszeichenketten nützliche Auswahlmittel. Ihre Genauigkeit bestimmt, wie viel Zeit sie darstellen: ein Jahr, einen Monat, einen Tag oder eine bestimmte Minute.
Eine ganze Kalenderperiode auswählen
Für tägliche Daten von Januar bis März 2025 wählt ts.loc["2025"] alle 90 Tage aus. ts.loc["2025-02"] wählt die 28 Tage des Februars aus. Bei stündlichen Daten wählt eine Tageszeichenkette den ganzen Tag aus, nicht nur Mitternacht.
Verwende .loc auch bei einem DataFrame:
february = df.loc["2025-02", "kwh"]
spring_onward = df.loc["2025-03-01":]
df["2025-02"] fragt dagegen eine Spalte mit diesem Namen ab. Ein Zeitindex macht die Spaltenauswahl mit eckigen Klammern nicht zur Zeilenauswahl.
Den Endpunkt genau lesen
Ein bezeichnungsbasierter Slice schließt beide Endpunkte ein. ts.loc["2025-01-30":"2025-02-02"] umfasst den 30. und 31. Januar sowie den 1. und 2. Februar. Ein positionsbasierter Slice wie ts.iloc[0:4] endet vor Position 4.
Das Ende eines Slices mit unvollständiger Datumszeichenkette umfasst die gesamte benannte Periode. Bei stündlichen Daten schließt df.loc[:"2025-06-01"] den ganzen 1. Juni ein. df.loc[:"2025-06-01 00:00"] endet um Mitternacht. Ebenso schließt ein Slice, der mit „2025-02“ endet, den ganzen Februar ein. Eine genauere Zeichenkette verändert die Grenze, schreibe den Endpunkt also passend zur Fragestellung.
ts.truncate(before="2025-03-01") behält alles ab dem 1. März. Das Argument after= schneidet das andere Ende ab. Vorheriges Sortieren vermeidet Fehler, die auftreten können, wenn Slices mit Datumszeichenketten auf ungeordnete Bezeichnungen treffen.
Wiederkehrende Kalenderbedingungen auswählen
Kalenderattribute erzeugen boolesche Masken:
weekends = df[df.index.day_of_week >= 5]
evening_march = df[(df.index.month == 3) & (df.index.hour >= 18)]
Montag ist 0, Samstag und Sonntag sind also 5 und 6. Jede Bedingung benötigt Klammern, wenn sie mit & oder | verbunden wird. Verwende bei einer Datums- und Zeitspalte df["timestamp"].dt.day_of_week statt eines Indexattributs. Die Wochentagsmaske wählt ein wiederkehrendes Kalendermuster aus; das unterscheidet sich von der Auswahl eines zusammenhängenden Datumsintervalls.
Ein Tageszeitfenster für jedes Datum auswählen
df.between_time("09:00", "17:00") wählt diese Stunden an jedem Tag aus. Standardmäßig sind beide Enden eingeschlossen, sodass ein vollständiger Tag mit stündlichen Daten neun Zeilen ergibt. inclusive="left" schließt 09:00 Uhr ein und 17:00 Uhr aus und ergibt acht Zeilen. df.at_time("12:00") wählt jeden Tag genau 12:00 Uhr aus.
Ein Tageszeitfenster kann über Mitternacht reichen. between_time("22:00", "06:00") wählt späte Abend- und frühe Morgenzeilen über den ganzen Index aus. Es wählt kein einzelnes zusammenhängendes Intervall zwischen zwei bestimmten Daten aus. Bei einem Index mit Zeitzoneninformation nutzt die Auswahl mit Datumszeichenketten die lokale Zeitzone des Index; rechne den Index um, bevor du einen Berichtstag in einer anderen Zeitzone auswählst.
Wichtige Erkenntnisse
- Eine unvollständige Datumszeichenkette wählt ihre ganze Periode aus.
- Bezeichnungsbasierte Slices schließen den Endpunkt ein; positionsbasierte Slices schließen die Endposition aus.
- Verwende
.locfür die Datumsauswahl in einem DataFrame. - Kalenderbasierte Masken und Tageszeitfenster wählen wiederkehrende Muster aus.
- Prüfe vor dem Filtern die Genauigkeit des Endpunkts und die Zeitzone.
2.3 Werte im Zeitverlauf anhand von Verschiebungen, Differenzen und prozentualen Änderungen vergleichen
Eine Änderung braucht einen klaren Vergleichspunkt. „Vorherig“ kann die vorherige beobachtete Zeile, den vorherigen Kalendertag oder denselben Monat ein Jahr zuvor bedeuten. Wähle diese Bedeutung, bevor du eine Verzögerung oder Wachstumsrate berechnest.
Frühere Werte neben aktuelle setzen
Für die Besucherzahlen 200, 210 und 189 vom 3. bis 5. März ergibt s.shift(1) die Werte NaN, 200 und 210. Es verschiebt Werte um eine Zeile nach unten und behält die Bezeichnungen bei. Die neue erste Stelle fehlt, weil keine frühere Beobachtung vorhanden ist. shift(-1) ergibt 210, 189 und NaN: ein Vorlauf, der den nächsten Wert in die aktuelle Zeile holt.
df["previous"] = df["visitors"].shift(1)
df["change"] = df["visitors"].diff()
df["growth"] = df["visitors"].pct_change()
diff() subtrahiert den vorhergehenden Wert und ergibt NaN, 10 und −21. pct_change() dividiert den aktuellen Wert durch den vorherigen und subtrahiert 1. Das ergibt NaN, 0,05 und −0,10. Dies sind Anteile: 0,05 bedeutet 5 %, nicht 0,05 %. Gleitkommaausgaben können winzige zusätzliche Stellen enthalten; runde nach der Berechnung für die Anzeige.
Die Verzögerung in Zeilen oder Zeit wählen
pct_change(7) vergleicht mit dem Wert sieben Zeilen zuvor. Das ist nur dann derselbe Wochentag eine Woche zuvor, wenn lückenlos genau eine Zeile pro Tag vorhanden ist. Bei einer vollständigen monatlichen Zeitreihe ergibt pct_change(12) die Änderung gegenüber dem Vorjahr.
shift(1, freq="D") verschiebt die Zeitstempel um einen Tag nach vorn und lässt die Werte an den verschobenen Bezeichnungen. Es behält jeden Wert bei. Rechnungen mit dem Original richten die Werte dann anhand des Datums aus:
previous_day = s.shift(1, freq="D")
daily_change = s - previous_day
Enthält die Quelle nur am Montag und Donnerstag Beobachtungen, vergleicht ein einfaches shift(1) den Donnerstag mit dem Montag. Eine Datumsverschiebung ermöglicht einen Vergleich mit Mittwoch; fehlt der Mittwoch, fehlt die tägliche Änderung für Donnerstag. Das Füllen dieser Lücke ist eine separate Entscheidung über die Daten.
Beachten, dass Rechnungen Bezeichnungen ausrichten
Zwei Series werden anhand der Zeitstempel kombiniert, nicht anhand der Zeilenposition. Addiere die Werte 200, 210 und 189 am 3., 4. und 5. März zu den Werten 1 und 1 am 4. und 7. März. Nur am 4. März liegen zwei Beobachtungen vor, sodass die Summe 211 beträgt. Die Vereinigung der Daten umfasst den 3., 4., 5. und 7. März; die übrigen Ergebnisse fehlen.
Verwende s.add(other, fill_value=0), wenn eine fehlende Beobachtung tatsächlich null bedeutet, etwa bei einer überprüften Ereignisanzahl. Es ist keine allgemeine Korrektur für fehlende Sensormesswerte.
Vergleiche je Zeitreihe neu beginnen
Sortiere eine lange Tabelle nach ihrem Zeitreihenschlüssel und Datum und berechne dann innerhalb der Gruppen. df.groupby("store")["sales"].pct_change() vergleicht jedes Geschäft nur mit sich selbst. Verkauft Geschäft A für 100 und dann 110 und Geschäft B für 50 und dann 40, lauten die Wachstumsraten: fehlend, 0,10, fehlend und −0,20. Eine einfache spaltenweite Berechnung würde den ersten Verkauf von B mit dem letzten Verkauf von A vergleichen. Dieses numerische Ergebnis würde einen Geschäftswechsel beschreiben, kein Wachstum im Zeitverlauf.
Wichtige Erkenntnisse
- Eine Verzögerung verschiebt frühere Werte neben spätere.
pct_change()gibt einen Anteil zurück; multipliziere ihn mit 100, um einen Prozentsatz anzugeben.- Zeilenverschiebungen und Datumsverschiebungen beantworten unterschiedliche Fragen.
- Rechnungen richten Zeitstempel aus, keine Positionen.
- Berechne Änderungen getrennt innerhalb jeder Zeitreihe.
3Datumsfolgen erzeugen und Frequenzen, Offsets und Perioden nutzen
Kalenderregeln machen wiederkehrende Arbeit mit Datumsangaben zuverlässig. Erzeuge eine vollständige Datumsfolge anhand einer Frequenz, verschiebe auf das nächste Monatsende oder den nächsten Geschäftstag und bezeichne ganze Monate oder Quartale mit Perioden. Jede Darstellung beantwortet eine andere Frage: Eine Zeitdauer zählt verstrichene Zeit, ein Offset folgt einer Kalenderregel und eine Periode bezeichnet eine Zeitspanne. Achte auf Ankerpunkte und Endpunkte, um Fehler um eins und Verwechslungen bei Geschäftsjahren zu vermeiden.
3.1 Regelmäßige Datumsfolgen mit Frequenzkürzeln erstellen
Eine regelmäßige Datumsfolge ist ein Kalender, den du erzeugen kannst, statt jede Bezeichnung einzutippen. Sie kann Testdaten bezeichnen, ein erwartetes Berichtsraster festlegen oder nach einer Neuindizierung fehlende Beobachtungen sichtbar machen.
Anfang und Regel angeben
ends = pd.date_range("2025-01-01", periods=4, freq="ME")
Die vier Zeitstempel sind der 31. Januar, 28. Februar, 31. März und 30. April. „ME“ bedeutet Monatsende, also ist das erste Datum das erste Monatsende am oder nach dem Anfang. Eine regelmäßige Frequenz kann einer Kalenderregel folgen, auch wenn die verstrichenen Abstände unterschiedlich lang sind.
Gib normalerweise zwei der Angaben start, end und periods sowie freq an. Ohne ausdrückliche Frequenz gilt standardmäßig ein Kalendertag. periods zählt Zeitstempel, nicht Abstände: Vier stündliche Zeitstempel enthalten drei Abstände.
Häufige Kürzel lesen
| Regel | Kürzel | Beispiel |
|---|---|---|
| Kalender- oder Geschäftstag | D, B | Tägliche Daten oder Daten von Montag bis Freitag |
| Woche mit Ankertag | W, W-MON | Sonntage oder Montage |
| Monatsgrenze | MS, ME | Erster oder letzter Kalendertag |
| Quartalsgrenze | QS, QE | Quartalsanfang oder -ende |
| Jahresgrenze | YS, YE | Jahresanfang oder -ende |
| Festes Zeitintervall | h, min, s, ms | Stunden bis Millisekunden |
Vielfache drücken größere Abstände aus: „15min“, „2h“ und „90min“. Beginnst du um 08:00 Uhr mit vier Perioden zu „90min“, erhältst du 08:00, 09:30, 11:00 und 12:30 Uhr. „1h30min“ drückt denselben Abstand aus.
Frequenzen für Zeitstempel verwenden in pandas 3 „ME“, „QE“, „YE“, „BME“, „h“, „min“, „s“, „ms“ und „us“. Die älteren Kürzel „M“, „Q“, „Y“ oder „A“, „BM“, „H“, „T“, „S“, „L“ und „U“ funktionieren bei diesen Zeitstempeloperationen nicht mehr. Monatsperioden verwenden weiterhin „M“, weil eine Periode eine Zeitspanne beschreibt.
Ankerpunkte und Geschäftstage beachten
Eine kalendergebundene Datumsfolge nimmt den angegebenen Anfang nicht zwingend in ihre Ausgabe auf. Beginnst du am 15. Januar 2025 mit freq="MS", erhältst du zuerst den 1. Februar. Im Januar 2025 ergibt „W-MON“ den 6., 13., 20. und 27. Januar; ein einfaches „W“ ergibt Sonntage. „WOM-3FRI“ bedeutet den dritten Freitag jedes Monats.
„B“ überspringt Wochenenden, kennt aber keine lokalen Feiertage. Der März 2025 enthält 21 Tage von Montag bis Freitag. Ein benutzerdefinierter Kalender kann einen angegebenen Feiertag ausschließen:
pd.bdate_range("2025-03-01", "2025-03-31",
freq="C", holidays=["2025-03-17"])
Diese Datumsfolge enthält 20 Daten. Die Feiertagsliste wird ausdrücklich angegeben; aus Zeitzone oder Sprache wird kein Land abgeleitet.
Endpunkte sorgfältig zählen
Passende Anfangs- und Endpunkte sind standardmäßig eingeschlossen. Stündlich von Mitternacht am 1. Januar bis Mitternacht am 2. Januar ergibt 25 Zeitstempel. Verwende periods=24 für genau 24 stündliche Messwerte oder inclusive="left", um das Ende auszuschließen. normalize=True setzt die Uhrzeit von Anfang und Ende auf Mitternacht. Ergänze tz="Asia/Tokyo", wenn die erzeugten Bezeichnungen eine Zeitzone tragen sollen.
Wichtige Erkenntnisse
- Frequenzkürzel drücken Zeitintervalle oder Kalenderankerpunkte aus.
- Eine kalendergebundene Datumsfolge beginnt beim ersten passenden Datum.
- Bei Geschäftstagsfolgen müssen Feiertage ausdrücklich angegeben werden.
- Zähle Zeitstempel und prüfe die Einbeziehung der Endpunkte getrennt.
- Verwende für Zeitstempelfrequenzen die aktuellen Kürzel von pandas 3.
3.2 Datumswerte mit kalenderbezogenen Offsets verschieben
„Einen Monat später“ ist eine Kalenderanweisung. „Dreißig Tage später“ ist eine verstrichene Zeitdauer. Die Ergebnisse können sich unterscheiden, weil Monate und Jahre nicht alle dieselbe Anzahl von Tagen haben.
Zeitdauer und Kalenderverschiebung unterscheiden
Ein Timedelta addiert eine feste verstrichene Zeitdauer. Ein DateOffset folgt Kalenderfeldern. Ausgehend vom 31. Januar 2025:
t = pd.Timestamp("2025-01-31")
t + pd.DateOffset(months=1) # February 28
t + pd.Timedelta(days=30) # March 2
Beim DateOffset verschiebst du zunächst in den Februar und behältst dann den Tag 31 bei, falls er existiert. Das ist nicht der Fall, daher begrenzt pandas auf den letzten gültigen Tag im Februar. Vom 31. Januar 2024 aus ist das Ergebnis der 29. Februar, weil es ein Schaltjahr ist. pd.Timedelta(months=1) ist ungültig: Ein Monat hat keine einheitliche feste Dauer.
Derselbe Unterschied gilt für Jahre. Vom 1. Januar 2024 aus enden 365 verstrichene Tage am 31. Dezember 2024. pd.DateOffset(years=1) endet am 1. Januar 2025. Verwende die in der eigentlichen Frage genannte Einheit, statt sie durch eine bequeme Anzahl von Tagen zu ersetzen.
Zu einem Kalenderankerpunkt verschieben
pd.offsets.MonthEnd(1) verschiebt auf das nächste Monatsende. Vom 15. Januar 2025 aus ergibt sich der 31. Januar. Vom 31. Januar aus ergibt sich der 28. Februar. Die Anzahl eins bedeutet, zum nächsten Ankerpunkt vorzugehen, daher wird auch ein bereits passendes Datum verschoben.
MonthEnd(0) verschiebt ein Datum auf das Ende seines aktuellen Monats, lässt ein bestehendes Monatsende aber unverändert. Das ist nützlich, um jede Beobachtung mit dem Ende ihres Monats zu bezeichnen:
month_labels = df.index + pd.offsets.MonthEnd(0)
Ein Offset hat außerdem rollforward() und rollback(). Für den 15. Januar ist der nächste MonthEnd-Ankerpunkt nach vorn der 31. Januar und der nächste nach hinten der 31. Dezember 2024. Diese Operationen wählen den nächsten gültigen Ankerpunkt in einer Richtung.
Über Geschäftstage verschieben
Der 14. März 2025 ist ein Freitag. Die Addition von pd.offsets.BDay(1) ergibt Montag, den 17. März. Die Addition eines verstrichenen Tages ergibt Samstag, den 15. März. Eine standardmäßige Geschäftstagsregel überspringt Wochenenden; für Feiertage ist ein ausdrücklich angegebener benutzerdefinierter Kalender nötig.
Frequenzzeichenketten sind Kurznamen für Offset-Objekte: „ME“ entspricht MonthEnd, „B“ BusinessDay und „W-MON“ einer auf Montag verankerten Woche. So lässt sich dieselbe Kalenderbedeutung für eine Datumsfolge, eine Resampling-Regel oder eine Datumsverschiebung nutzen.
Die gewünschte Uhrzeit über die Sommerzeitumstellung hinweg behalten
In pandas 3 bedeutet pd.offsets.Day(1) einen Kalendertag und behält die lokale Uhrzeit bei. pd.Timedelta(days=1) addiert genau 24 Stunden. Vom 29. März 2025 um 12:00 Uhr in Amsterdam aus endet der Kalenderoffset am 30. März um 12:00 Uhr, nach nur 23 verstrichenen Stunden. Das Timedelta endet um 13:00 Uhr. Ein wiederkehrender lokaler Termin und eine gemessene Gerätelaufzeit benötigen daher unterschiedliche Operationen.
Wichtige Erkenntnisse
- Monate und Jahre sind Kalenderregeln, keine festen Zeitdauern.
- Ein Monats-Offset begrenzt auf den letzten gültigen Tag des Zielmonats.
MonthEnd(1)verschiebt ein bestehendes Monatsende weiter;MonthEnd(0)behält es bei.- Geschäftstags-Offsets überspringen Wochenenden.
- Ein Kalendertag und 24 verstrichene Stunden können sich unterscheiden.
3.3 Mit ganzen Monaten, Quartalen und Geschäftsjahren als Perioden arbeiten
Eine monatliche Umsatzsumme gehört zu einem ganzen Monat. Sie lässt sich mit einem einzelnen Zeitstempel bezeichnen, doch eine Period gibt ihre Zeitspanne direkt an. Eine Period kombiniert einen Wert mit einer Frequenz, sodass „2025-03“ mit der Frequenz „M“ den gesamten März 2025 bedeutet.
Zeitspannen darstellen und verschieben
march = pd.Period("2025-03", freq="M")
months = pd.period_range("2025-01", "2025-04", freq="M")
months ist ein PeriodIndex mit vier Elementen und dem Datentyp period[M]. Die start_time des März ist Mitternacht am 1. März; seine end_time ist bei Mikrosekundenauflösung der 31. März um 23:59:59.999999. Das Ende ist der letzte Zeitpunkt, nicht Mitternacht zu Beginn des letzten Tages.
Periodenrechnungen verschieben in der eigenen Einheit der Periode. march + 1 ist April 2025. Juni minus März mit monatlicher Frequenz ergibt einen Offset von drei Monatsenden, dessen .n gleich 3 ist. Eine Monatsperiode kennt auch .days_in_month: Der Februar 2025 hat 28 Tage.
Zeitpunkte in Zeitspannen und zurück umwandeln
monthly_labels = df.index.to_period("M")
column_labels = df["date"].dt.to_period("M")
start_labels = monthly_labels.to_timestamp()
end_labels = monthly_labels.to_timestamp(how="end")
Jeder Zeitstempel im März wird derselben Monatsperiode zugeordnet. Die Rückumwandlung dieser Periode ergibt standardmäßig ihren Anfang oder auf Wunsch ihr Ende. Der ursprüngliche Tag und die ursprüngliche Uhrzeit einer Beobachtung werden dadurch nicht wiederhergestellt: Die Umwandlung in eine Periode hat diese Details verworfen.
Halte die Kürzelfamilien auseinander. Eine monatliche Zeitspanne verwendet „M“ in Period und period_range. Ein Zeitstempel für ein Monatsende verwendet „ME“ in date_range und beim Resampling von Datums- und Zeitwerten. Die beiden Namen beschreiben unterschiedliche Arten von Bezeichnungen.
Die Frequenz einer Periode ändern
Die Methode .asfreq() einer Periode wählt eine umfassende oder enthaltene Periode mit einer anderen Frequenz aus. march.asfreq("D", how="start") ergibt den 1. März als Tagesperiode; how="end" ergibt den 31. März. Eine mit how="start" in „M“ umgewandelte Jahresperiode ergibt den Januar.
Dies wählt eine Periode an der Grenze aus; eine Monatssumme wird dadurch nicht auf Tage aufgeteilt. Bei einer Series mit PeriodIndex kann Resampling monatliche zu vierteljährlichen Zeitspannen aggregieren. Die Anzahlen der Tage in jedem Monat des Jahres 2025 ergeben die Quartalssummen 90, 91, 92 und 92.
Geschäftsjahresquartale lesen
Ein Geschäftsjahresquartal wird innerhalb eines Geschäftsjahres benannt, dessen Endmonat ausdrücklich angegeben ist. Bei „Q-JUN“ endet das Geschäftsjahr 2025 im Juni 2025. Sein erstes Quartal läuft daher von Juli bis September 2024:
q = pd.Period("2025Q1", freq="Q-JUN")
Bei „Q-MAR“ fällt der 10. Mai 2025 in 2026Q1, weil dieses Geschäftsjahr im März 2026 endet. Das Jahr in einer Geschäftsjahresbezeichnung muss nicht mit dem Kalenderjahr ihres ersten Tages übereinstimmen. Für Zeitstempelfilter ist es oft klarer, Zeiten vor dem Beginn der nächsten Periode auszuwählen, als den letzten Sekundenbruchteil der aktuellen Periode zu konstruieren.
Wichtige Erkenntnisse
- Perioden beschreiben Zeitspannen und werden in ihrer eigenen Frequenzeinheit verschoben.
- Die Umwandlung in eine Periode verwirft genauere Zeitstempeldetails.
- Frequenzkürzel für Perioden und Zeitstempel unterscheiden sich.
- Geschäftsjahre werden nach ihrem Endjahr bezeichnet.
4Die Frequenz einer Zeitreihe durch Resampling ändern
Eine Frequenzänderung verändert die Frage an die Beobachtungen. Detaillierte Messwerte können zu Tagessummen oder Monatsmittelwerten werden; eine dünn besetzte Zeitreihe kann in ein feineres Raster mit leeren Stellen umgewandelt werden. Wähle Aggregationen und Auffüllmethoden nach der Bedeutung der Werte und prüfe anschließend die Grenzen der Zeitintervalle. Enthält eine Tabelle mehrere Geschäfte oder Sensoren, behalte deren Kennungen bei der Gruppierung bei, damit die entstehenden Verläufe getrennt bleiben.
4.1 Zeitreihen durch Downsampling zu Summen, Mittelwerten und anderen Kennwerten verdichten
Resampling beantwortet Fragen wie „Wie viel Energie wurde täglich verbraucht?“ oder „Wie hoch war die durchschnittliche Temperatur in jedem Monat?“. Es gruppiert Beobachtungen in Zeitintervalle und wendet anschließend eine Aggregation an.
Einen zur Größe passenden Kennwert wählen
daily = df.resample("D").agg({"kwh": "sum", "temp_c": "mean"})
Energie in kWh und Niederschlag in mm addieren sich über die Zeit. Temperatur beschreibt einen Zustand, daher ist ein Mittelwert aussagekräftiger als eine Summe. last() eignet sich für einen Schlusskontostand, während max() einen Höchstwert findet. Tägliche Verkäufe lassen sich für den monatlichen Gesamtverkauf summieren oder für den durchschnittlichen Verkauf pro beobachtetem Tag mitteln; die Frage entscheidet.
resample() gibt zunächst einen Resampler zurück, bis du eine Aggregation wie sum(), mean(), count() oder agg() aufrufst. Verwende on="date", wenn die Datums- und Zeitwerte in einer Spalte statt im Index stehen.
Kalenderintervalle und unvollständige Abdeckung lesen
Eine tägliche Zeitreihe aus Einsen vom 1. Januar bis zum 30. April 2025 ergibt mit resample("ME").sum() die Monatssummen 31, 28, 31 und 30. „MS“ ergibt dieselben Monatssummen mit den Monatsanfängen als Bezeichnungen. Resampling auf Quartalsenden ergibt 90 für Januar bis März und 30 für ein zweites Quartal, das nur April enthält. Eine Bezeichnung mit dem 30. Juni belegt nicht, dass Mai und Juni beobachtet wurden.
Wöchentliche „W“-Intervalle enden am Sonntag. Tägliche Werte von 1 bis 14 ab Montag, dem 3. März, ergeben 28 für die mit dem 9. März bezeichnete Woche und 77 für die mit dem 16. März bezeichnete Woche. „W-MON“ endet am Montag; das erste Intervall enthält dann nur den 3. März. Lies den Wochentag des Ankerpunkts, bevor du eine Bezeichnung als Wochenanfang interpretierst.
Zugehörigkeit und Bezeichnung unterscheiden
closed steuert, welche Grenze zu einem Intervall gehört. label steuert den Zeitstempel, der beim Ergebnis ausgegeben wird. Bei den meisten Regeln, darunter „5min“, „h“, „D“ und „MS“, ist beides standardmäßig „left“.
Die Werte 0 bis 9, einer pro Minute ab 00:00 Uhr, ergeben zwei standardmäßige Fünf-Minuten-Summen: 10 mit der Bezeichnung 00:00 und 35 mit der Bezeichnung 00:05. Das erste Intervall enthält 00:00 bis 00:04 Uhr. Mit closed="right", label="right" lauten die Ergebnisse 0 um 00:00 Uhr, 15 um 00:05 Uhr und 30 um 00:10 Uhr. Das mittlere Intervall enthält 00:01 bis 00:05 Uhr. Wird nur die Bezeichnung geändert, ändert sich die Zugehörigkeit nicht.
Endregeln wie „ME“, „QE“, „YE“, „W“ und „BME“ sind standardmäßig rechts abgeschlossen und rechts bezeichnet. Intervalle fester Länge beginnen normalerweise um Mitternacht des ersten Tages, sodass 15-Minuten-Grenzen bei 00:00, 00:15 Uhr und so weiter liegen.
Leere Intervalle von tatsächlichen Nullen unterscheiden
Für einen leeren Tag ist sum() gleich 0, count() gleich 0 und mean() gleich NaN. Verwende sum(min_count=1), damit der Wert fehlt, wenn kein Messwert verfügbar ist. Ein erfasster Nullwert und ein fehlender Messwert bleiben dann unterscheidbar.
Für mehrere Kennwerte einer Zeitreihe liefert .ohlc() Eröffnung, Hoch, Tief und Schluss: den ersten, größten, kleinsten und letzten beobachteten Wert in jedem Intervall. Die Messwerte 10, 12 und 11 ergeben Eröffnung 10, Hoch 12, Tief 10 und Schluss 11. Eröffnung und Schluss hängen von der zeitlichen Reihenfolge ab, nicht von der numerischen Größe.
Wichtige Erkenntnisse
- Wähle Aggregationen nach der Bedeutung der Werte.
closedlegt die Zugehörigkeit fest;labellegt die angezeigte Zeit fest.- Wochenbezeichnungen nennen normalerweise den letzten Tag der Woche.
- Prüfe unvollständige erste und letzte Intervalle.
sum(min_count=1)erhält leere Intervalle als fehlend.- OHLC bezeichnet den ersten, größten, kleinsten und letzten Wert.
4.2 Eine Zeitreihe durch Upsampling verfeinern und Lücken füllen
Ein feineres Raster erzeugt Stellen, keine Messungen. Entscheide vor dem Auffüllen, ob jeder Wert einen Zustand, eine Anzahl, eine stetige Messgröße oder eine Summe über eine Zeitspanne darstellt.
Die neuen Stellen sichtbar machen
s = pd.Series([10.0, 16.0],
index=pd.to_datetime(["2025-06-01", "2025-06-04"]))
daily = s.asfreq("D")
Das tägliche Ergebnis lautet 10, NaN, NaN, 16. s.resample("D").asfreq() ergibt hier dasselbe Raster. Werte bleiben bei passenden Zeitstempeln erhalten; die neuen Daten enthalten keine ursprüngliche Beobachtung.
Der Bedeutung entsprechend auffüllen
| Methode | Ergebnis vom 1. bis 4. Juni | Passende Bedeutung |
|---|---|---|
ffill() | 10, 10, 10, 16 | Ein Zustand gilt bis zur Änderung |
bfill() | 10, 16, 16, 16 | Ein späterer Wert wird für frühere Stellen genutzt |
interpolate() | 10, 12, 14, 16 | Die Änderung wird entlang einer Geraden geschätzt |
Eine Thermostateinstellung gilt, bis sie jemand ändert, daher ist Vorwärtsauffüllen nützlich. Ein sich stetig ändernder Wasserstand kann Interpolation rechtfertigen. Null eignet sich für eine Ereignisanzahl nur, wenn der fehlende Eintrag bedeutet, dass kein Ereignis stattfand. Ein Sensorausfall belegt keinen Messwert von null.
Das Interpolationsbeispiel verwendet ein regelmäßiges Tagesraster. Die gesamte Änderung beträgt 6 über drei Schritte von jeweils einem Tag, also kommen bei jedem Schritt 2 hinzu. Die beiden inneren Werte sind Schätzungen, keine neu gewonnenen Messungen.
Rückwärtsauffüllen nutzt Informationen aus der Zukunft. Es kann nicht beschreiben, was eine beobachtende Person zu jedem früheren Zeitpunkt wusste. Vorwärtsauffüllen respektiert diese Zeitrichtung, aber bei langen Lücken kann ein übernommener Zustand dennoch veralten. daily.ffill(limit=1) füllt eine Stelle nach einem Messwert und ergibt in diesem Beispiel 10, 10, NaN, 16.
Ausdrückliche Berichtsgrenzen verwenden
asfreq("D") reicht vom ersten bis zum letzten Quellzeitstempel. Indiziere neu, wenn der Kalender weiter reichen muss:
calendar = pd.date_range("2025-06-01", "2025-06-05", freq="D")
complete = s.reindex(calendar)
Der 5. Juni ist nun ebenfalls sichtbar. fill_value=0 füllt bei der Neuindizierung neu erzeugte Bezeichnungen und ist damit für überprüfte Tage ohne Ereignisse nützlich. Bereits in der Quelle vorhandene fehlende Werte werden dadurch nicht ersetzt. Sowohl die Neuindizierung als auch asfreq() benötigen eindeutige Quellbezeichnungen.
Auswahl und Aggregation unterscheiden
asfreq() wählt Werte zu Zielzeitstempeln aus. Es fasst die dazwischenliegenden Beobachtungen nicht zusammen. Bei 48 stündlichen Werten von 0 bis 47 wählt asfreq("D") die Mitternachtsmesswerte 0 und 24 aus. resample("D").sum() ergibt dagegen 276 und 852, indem jeder Stundenwert des jeweiligen Tages addiert wird.
Eine Monatssumme kann nicht auf jeden Tag vorwärts aufgefüllt und danach summiert werden: Das würde dieselbe Summe wiederholt zählen. Für eine gleichmäßige Aufteilung auf die Tage muss durch die Anzahl der Tage des Monats dividiert werden. Das ist eine Annahme zur Aufteilung und unterscheidet sich von der Übernahme eines Zustands oder der Schätzung einer stetigen Messgröße.
Wichtige Erkenntnisse
- Ein feineres Raster fügt leere Stellen hinzu, keine Beobachtungen.
- Wähle das Auffüllen nach der Bedeutung der Größe und der Zeitrichtung.
- Begrenze das Auffüllen, wenn lange Lücken sichtbar bleiben sollen.
asfreq()wählt Zeitpunkte aus; Resampling mit Aggregation fasst Intervalle zusammen.
4.3 Mehrere Zeitreihen gruppenweise gleichzeitig durch Resampling umwandeln
Eine lange Tabelle kann viele Zeitreihen in einer Wertespalte enthalten. Ein Geschäftsschlüssel unterscheidet Geschäfte, ein Sensorschlüssel unterscheidet Sensoren. Gruppiere nach dieser Kennung und nach Zeit, wenn die Frage für jede Zeitreihe einen separaten Verlauf verlangt.
Einen Zeitreihenschlüssel mit einer Zeitregel kombinieren
monthly = df.groupby([
"store", pd.Grouper(key="date", freq="ME")
])["sales"].sum()
pd.Grouper setzt eine Zeitintervallregel innerhalb von groupby ein. key= benennt eine Datums- und Zeitspalte; level= kann eine Datums- und Zeitindexebene benennen. Das Ergebnis hat eine Indexebene für das Geschäft und eine weitere für das Monatsende. Durch die Auswahl der numerischen Spalte konzentriert sich die Aggregation auf den Umsatz.
Angenommen, Geschäft A erzielt am 5. Januar einen Umsatz von 100, am 20. Januar von 150 und am 3. Februar von 120. Geschäft B erzielt am 11. Januar 80, am 14. Februar 90 und am 25. Februar 60. Das gruppierte Ergebnis lautet für A: Januar 250, Februar 120; für B: Januar 80, Februar 150. Resampling der ganzen Tabelle ohne Geschäftsschlüssel würde die Geschäfte zu Januar 330 und Februar 270 zusammenfassen.
Innerhalb jeder Gruppe Resampling durchführen
Eine zweite Form macht zuerst das Datum zum Index:
monthly = (df.set_index("date")
.groupby("store")["sales"]
.resample("ME").sum())
Sie erzeugt dieselben Summen für beobachtete Kombinationen aus Geschäft und Monat. Die beiden Formen unterscheiden sich, wenn ein Geschäft in einem dazwischenliegenden Monat keine Zeilen hat. Erscheint A nur im Januar und März, erzeugt gruppenweises Resampling zwischen dem ersten und letzten Datum von A ein Februarintervall; ein gewöhnliches sum() ergibt dort null. Die Gruppierung nach Geschäft und einem Grouper behält die Kombinationen, die Zeilen enthalten, sodass die Februar-Kombination von A fehlt.
Eine fehlende Kombination, ein als null zusammengefasstes leeres Intervall und eine fehlende Messung sind unterschiedliche Datenzustände. Entscheide, welchen der Bericht zeigen soll. Verwende ausdrückliche Neuindizierung, wenn alle Geschäfte einen Kalender teilen sollen, der über ihren beobachteten Zeitraum hinausreicht. Verwende min_count=1 bei einer Summe, wenn ein leeres Intervall fehlend bleiben soll.
Für den Vergleich umformen
monthly.unstack("store") verschiebt die Geschäftsebene in Spalten und belässt die Monate in Zeilen. Im Beispiel hat Januar A = 250 und B = 80; Februar hat A = 120 und B = 150. Eine fehlende Kombination aus Geschäft und Monat wird zu NaN; unstack("store", fill_value=0) ersetzt fehlende Kombinationen durch null, wenn diese Bedeutung passt.
Jahre bei Bedarf getrennt halten
Ein zeitbasierter Grouper mit „ME“ hält Januar 2024 und Januar 2025 getrennt. Die Gruppierung nach df["date"].dt.month behält nur Monatsnummern und fasst beide Januarmonate zusammen. Die erste Form beantwortet „Was geschah jeden Monat?“. Die zweite unterstützt einen saisonalen Vergleich wie den durchschnittlichen Januarumsatz über mehrere Jahre. Die Wahl hängt davon ab, welche zeitliche Zuordnung erhalten bleiben muss.
Wichtige Erkenntnisse
- Gruppiere nach Zeitreihenkennung und Zeit, um getrennte Verläufe zu erhalten.
- Gruppenweises Resampling und ein zeitbasierter Grouper unterscheiden sich bei leeren Monaten.
unstack()erleichtert den Vergleich von Zeitreihen in Spalten.- Monatsnummern fassen Jahre zusammen; monatliche Zeitintervalle halten sie getrennt.
5Daten mit gleitenden und wachsenden Fenstern glätten und zusammenfassen
Fensterkennwerte beschreiben, wie sich eine Zeitreihe verändert, ohne sie auf eine einzige Gesamtzahl zu reduzieren. Eine gleitende Berechnung folgt jüngsten Zeilen oder einer jüngsten Zeitspanne, eine wachsende Berechnung behält den bisherigen Verlauf bei und ein exponentiell gewichteter Mittelwert bevorzugt neuere Beobachtungen zunehmend. Untersuche, welche Werte in jedes Ergebnis eingehen, wie fehlende Daten es beeinflussen und wo das Ergebnis bezeichnet wird. Diese Entscheidungen bestimmen, was ein geglätteter Wert aussagen kann.
5.1 Gleitende Kennwerte über eine feste Anzahl von Zeilen berechnen
Ein gleitendes Fenster fasst wiederholt eine sich verschiebende Gruppe von Zeilen zusammen. Bei jeder neuen Zeile kommt der aktuelle Wert hinzu und irgendwann fällt der älteste heraus. Die Fensterlänge steuert, wie stark kurzfristige Schwankungen geglättet werden.
Ein Fenster nach dem anderen betrachten
Für die Werte 4, 8, 6, 10 und 12:
s = pd.Series([4, 8, 6, 10, 12])
s.rolling(3).mean()
Das erste vollständige Fenster ist [4, 8, 6] mit der Summe 18 und dem Mittelwert 6. Das nächste ist [8, 6, 10] mit dem Mittelwert 8. Das letzte ist [6, 10, 12] mit dem Mittelwert etwa 9,333. Die Standardergebnisse sind NaN, NaN, 6, 8 und 9,333, weil die ersten beiden Zeilen noch keine drei Beobachtungen haben.
Datenanforderungen und Platzierung steuern
min_periods legt die erforderliche Anzahl nicht fehlender Werte fest. Bei einem Fenster mit fester Zeilenanzahl entspricht der Standardwert der vollständigen Fenstergröße. Mit min_periods=1 verwenden die frühen Mittelwerte erst einen und dann zwei Werte: 4 und 6. Wegen ihrer kleineren Stichproben sind sie weniger stabil als die späteren Mittelwerte aus drei Werten.
Fehlende Werte belegen weiterhin Zeilenpositionen. In [4, NaN, 6, 10, 12] hat ein Fenster mit drei Zeilen, das den fehlenden Wert enthält, nur zwei gültige Beobachtungen. min_periods=2 erlaubt den Mittelwert von [4, NaN, 6], der 5 beträgt; die Standardeinstellung erlaubt ihn nicht.
Ergebnisse gehören normalerweise zur letzten Zeile des Fensters. Mit center=True erscheinen dieselben drei Mittelwerte vollständiger Fenster in den mittleren Zeilen und ergeben NaN, 6, 8, 9,333, NaN. Ein zentrierter Wert nutzt spätere Beobachtungen relativ zu seiner Bezeichnung. Verwende rückwärtsgerichtete Fenster, um zu beschreiben, was zu jedem Zeitpunkt bekannt war.
Mehr als den Mittelwert zusammenfassen
Dieselben Fenster unterstützen sum(), max(), min() und std(). pandas verwendet standardmäßig die Stichprobenstandardabweichung: [4, 8, 6] hat die Standardabweichung 2. Eine eigene Funktion kann eine Spannweite berechnen:
s.rolling(3).apply(lambda v: v.max() - v.min(), raw=True)
Die Spannweiten der vollständigen Fenster sind 4, 4 und 6. raw=True übergibt Arraywerte an die Funktion. Zwei ausgerichtete Zeitreihen können ebenfalls ein Fenster teilen: a.rolling(3).corr(b) misst die Korrelation über die letzten drei gepaarten Beobachtungen, sodass der Zusammenhang im Zeitverlauf variieren kann.
Eine sinnvolle Länge und Gruppierung wählen
Bei genau einer vollständigen täglichen Zeile pro Tag enthält ein Mittelwert über sieben Zeilen jeden Wochentag einmal und mittelt eine feste wiederkehrende Wochentagskomponente heraus. Ein Mittelwert über zwölf Zeilen bewirkt bei vollständigen Monatsdaten dasselbe für eine feste Jahreskomponente. Längere Fenster glätten stärker, reagieren aber später auf Wendungen; ein rückwärtsgerichteter Mittelwert über n Zeilen hat ungefähr ein halbes Fenster Verzögerung, etwa (n − 1) / 2 Zeilen.
Zeilen sind keine Tage. Sieben Messwerte mit Lücken können mehr als eine Woche umfassen. Verwende ein Zeitfenster, wenn die Frage eine verstrichene Zeitspanne nennt. Sortiere in einer langen Tabelle jede Zeitreihe zeitlich und führe Fenster innerhalb ihrer Gruppe aus: df.groupby("store")["sales"].rolling(2).sum(). So verhinderst du, dass ein Fenster von den Daten eines Geschäfts in die eines anderen übergeht.
Wichtige Erkenntnisse
- Ein Zeilenfenster zählt Zeilen, einschließlich Positionen mit fehlenden Werten.
min_periodszählt gültige Beobachtungen.- Zentrierte Fenster enthalten spätere Werte relativ zu ihren Bezeichnungen.
- Längere Fenster glätten stärker und reagieren langsamer.
- Wende Fenster getrennt innerhalb jeder Zeitreihe an.
- Gleitende Methoden können neben dem Niveau auch Streuung und Zusammenhänge zusammenfassen.
5.2 Zeitbasierte Fenster für unregelmäßig erfasste Daten nutzen
Für unregelmäßige Ereignisse eignen sich zeitlich definierte Fenster. „Bestellungen in den vergangenen drei Tagen“ sollte dieselbe Dauer umfassen, auch wenn es an einem Tag viele und am nächsten keine Bestellungen gibt.
Ein Fenster nach verstrichener Zeit definieren
s = pd.Series([5, 3, 4, 6], index=pd.to_datetime([
"2025-05-01", "2025-05-02", "2025-05-05", "2025-05-06"
]))
s.rolling("3D").sum()
Die Ergebnisse sind 5, 8, 4 und 10. Anders als rolling(3) definiert die Zeichenkette „3D“ eine Zeitspanne von drei Tagen. Die Anzahl der Zeilen innerhalb dieser Spanne kann variieren. Sortiere zuerst den DatetimeIndex; Zeitfenster benötigen monoton steigende Zeiten. Ein DataFrame kann mit on="date" eine sortierte Datums- und Zeitspalte verwenden.
Die Grenze vor dem Addieren prüfen
Standardmäßig schließt das Fenster den aktuellen Zeitpunkt ein und den Zeitpunkt genau drei Tage zuvor aus. Um Mitternacht am 5. Mai reicht das Intervall von unmittelbar nach Mitternacht am 2. Mai bis einschließlich Mitternacht am 5. Mai. Der Messwert vom 2. Mai liegt genau auf der ausgeschlossenen Grenze, sodass nur der Wert 4 vom 5. Mai eingeht.
Am 6. Mai beginnt das Fenster unmittelbar nach dem 3. Mai und enthält die Werte 4 und 6 mit der Summe 10. Mit closed="both" schließt das Fenster des 5. Mai auch den 2. Mai ein und ergibt die Summe 7. Die Wahl der Grenze kann ein Ergebnis verändern, selbst wenn Daten und Dauer gleich bleiben.
Ein Fenster mit zwei Zeilen ergibt für diese Zeitreihe NaN, 8, 7 und 10. Am 5. Mai enthält es die vorherige Zeile vom 2. Mai. Das beantwortet „die letzten zwei Messwerte“, eine andere Frage als „die letzten drei Tage“.
Eine Mindestanzahl an Beobachtungen festlegen
Für min_periods eines Zeitfensters gilt standardmäßig 1. Die erste Beobachtung kann daher sofort ein Ergebnis liefern. s.rolling("3D").count() ergibt 1, 2, 1 und 2 Messwerte und zeigt, auf wie vielen Werten das Ergebnis jeweils beruht. Ein Mittelwert aus einem Messwert und ein Mittelwert aus vielen Messwerten sind beide gültige Berechnungen, beruhen aber auf unterschiedlich vielen Daten.
Mit min_periods=2 lauten die Summen NaN, 8, NaN, 10. Die Dauer hat sich nicht geändert; die Berechnung verlangt nun mindestens zwei nicht fehlende Beobachtungen innerhalb dieser Zeitspanne. Ein größeres Zeitintervall garantiert für sich genommen keine zusätzlichen Beobachtungen.
Feste Längen verwenden und Zeitreihen trennen
Zeitbasierte gleitende Fenster benötigen eine feste Dauer wie „30min“, „24h“ oder „7D“. Eine Monatsendregel wie „1ME“ hat eine variable Länge und kann diese Art von Fenster nicht definieren. Verwende eine angegebene feste Länge wie „30D“, wenn das die beabsichtigte Regel ist, oder aggregiere zuerst in monatliche Intervalle, wenn die Frage Kalendermonate betrifft.
Für getrennte Kundenverläufe hält df.groupby("customer").rolling("30D", on="date")["amount"].sum() die Transaktionen jedes Kunden zusammen. Die Zeiten müssen innerhalb jedes Kunden geordnet sein. Das Ergebnis fügt den Gruppenschlüssel als Indexebene hinzu, sodass erhalten bleibt, welche Zeitreihe jedes Fenster beschreibt.
Wichtige Erkenntnisse
- Zeitfenster wählen nach Dauer aus und können unterschiedlich viele Zeilen enthalten.
- Standardmäßig ist die linke Grenze ausgeschlossen und der aktuelle Zeitpunkt eingeschlossen.
- Für
min_periodseines Zeitfensters gilt standardmäßig 1. - Kalendermonate können nicht als feste Dauer gleitender Fenster dienen.
5.3 Kumulative Summen, kumulative Maxima und exponentiell gewichtete Mittelwerte verfolgen
Manche Fragen benötigen den gesamten bisherigen Verlauf: „Wie viel hat sich angesammelt?“ oder „Was ist der bisher höchste Wert?“. Andere sollen jüngere Beobachtungen bevorzugen, ohne die Vergangenheit abrupt zu verwerfen. Wachsende und exponentiell gewichtete Berechnungen dienen diesen unterschiedlichen Zielen.
Den Verlauf Zeile für Zeile erweitern
Für die Werte 4, 8, 6, 10 und 12 ergibt s.expanding().mean() die Werte 4, 6, 6, 7 und 8. Das vierte Ergebnis berücksichtigt alle vier Werte: Ihre Summe ist 28 und ihr Mittelwert 7. expanding().sum() ergibt 4, 12, 18, 28 und 40, genau wie cumsum() bei dieser vollständigen Zeitreihe. expanding().max() ergibt 4, 8, 8, 10 und 12, genau wie cummax().
Wachsende Fenster verlangen standardmäßig eine Beobachtung. Sie behalten jede frühere Beobachtung mit gleichem Gewicht bei. Gegen Ende einer langen Zeitreihe trägt ein neuer Wert nur einen kleinen Teil zum bisherigen Verlauf bei, daher reagiert ein kumulativer Mittelwert langsam.
Kumulative Summen können an einer Grenze neu beginnen:
ytd = df.groupby(df.index.year)["sales"].cumsum()
by_store = df.groupby("store")["sales"].cumsum()
Sortiere innerhalb des jeweiligen Verlaufs, bevor du kumulierst. Eine einfache kumulative Summe über abwechselnde Geschäfte vermischt diese.
Den Abstand unter einem kumulativen Maximum messen
Für 100, 120, 90, 110 und 130 ergibt cummax() die Werte 100, 120, 120, 120 und 130. Berechne den Drawdown mit s / s.cummax() - 1. Bei 90 ist der frühere Höchstwert von 120 der Bezugswert, daher beträgt der Drawdown −0,25, also 25 % unter dem Höchstwert. Ein Vergleich von 90 mit dem ersten Wert 100 würde eine andere Frage beantworten. Ein neuer Höchstwert hat den Drawdown null.
Jüngere Werte stärker gewichten
Ein exponentiell gewichteter gleitender Mittelwert, kurz EWMA, verringert das Gewicht älterer Werte um einen konstanten Faktor. Für den Glättungsfaktor gilt , sodass span=3 den Wert 0,5 ergibt. Für adjust=False lautet die Aktualisierung:
Dabei ist die neue Beobachtung, der vorherige geglättete Wert und das aktualisierte Ergebnis. Der erste geglättete Wert entspricht der ersten Beobachtung. Danach erhält jeder neue Wert das Gewicht 0,5 und der vorherige geglättete Wert das Gewicht 0,5:
s.ewm(span=3, adjust=False).mean()
Für 4, 8, 6, 10 und 12 lauten die Ergebnisse 4, 6, 6, 8 und 10. Die letzte Aktualisierung mittelt die neue Beobachtung 12 und den vorherigen geglätteten Wert 8. Sie mittelt nicht nur die beiden jüngsten Rohwerte.
Die Einstellung für die Anpassung lesen
Die Standardeinstellung adjust=True normiert anhand der Summe der verfügbaren Gewichte. Für dieselben Daten lauten die frühen Ergebnisse 4; etwa 6,667; 6,286; 8,267 und 10,194. Dies ist eine andere Anfangsberechnung als die rekursive Form; der Unterschied nimmt ab, je mehr Verlauf verfügbar ist.
Wähle ein Argument für die Gewichtsabnahme: span, alpha, com oder halflife. Ein EWMA hat keinen festen Endpunkt, an dem eine alte Zeile plötzlich verschwindet. Ein gleitender Mittelwert hat diesen Endpunkt, während ein wachsender Mittelwert alle früheren Werte gleich gewichtet behält. Wähle danach, wie viel Einfluss jüngste Änderungen haben sollen.
Wichtige Erkenntnisse
- Wachsende Fenster berücksichtigen bis zu jeder Zeile den gesamten bisherigen Verlauf.
- Gruppiere kumulative Berechnungen, wenn Verläufe neu beginnen müssen.
- Der Drawdown vergleicht einen Wert mit seinem kumulativen Maximum.
- Die EWMA-Gewichte nehmen mit dem Alter allmählich ab.
adjust=Falsenutzt den vorherigen geglätteten Wert für die rekursive Aktualisierung.- Die standardmäßige Anpassung verändert frühe gewichtete Mittelwerte.
6Zeitzonen und Sommerzeit berücksichtigen
Eine lokale Uhrzeit bezeichnet nur dann einen Zeitpunkt, wenn ihre Zeitzone bekannt ist. Ordne die Zeitzone der Erfassung zu, rechne tatsächliche Zeitpunkte zwischen Zeitzonen um und halte Berechnungen in UTC ausgerichtet. Lokale Berichte benötigen dann die richtigen Kalendergrenzen, einschließlich der Stunden, die bei Sommerzeitumstellungen übersprungen oder wiederholt werden. Die Unterscheidung zwischen Lokalisierung und Umrechnung ermöglicht es, Einträge aus mehreren Orten zu kombinieren, ohne ihre Bedeutung unbemerkt zu verschieben.
6.1 Zeitstempeln Zeitzonen zuordnen und zwischen Zeitzonen umrechnen
Eine Uhrzeit benötigt einen Ort, um einen Zeitpunkt festzulegen. „2025-07-01 09:00“ ist ein Zeitstempel ohne Zeitzoneninformation. Durch das Hinzufügen von „Europe/Amsterdam“ erhält er Zeitzoneninformation: Im Juli hat er die Zeitverschiebung +02:00 und steht für 07:00 Uhr UTC. UTC ist die gemeinsame Zeitreferenz und kennt keine Sommerzeitumstellungen.
Die Zeitzone der Erfassung zuordnen
local = pd.Timestamp("2025-07-01 09:00")
aware = local.tz_localize("Europe/Amsterdam")
tz_localize() behält 09:00 Uhr bei und ordnet die Bedeutung der Zeitzone zu. Verwende den Ort, an dem die Uhrzeit erfasst wurde. Würde dieselbe Uhrzeit als UTC bezeichnet, beschriebe sie in diesem Beispiel einen anderen Zeitpunkt, zwei Stunden später.
Verwende IANA-Namen wie „Europe/Amsterdam“, „America/New_York“ und „Asia/Kolkata“. Benannte regionale Zeitzonen bewahren historische Zeitverschiebungen und Sommerzeitregeln. Eine feste Verschiebung von +01:00 tut das nicht. Kurze Namen sind uneinheitlich: „EST“ ist auf −05:00 festgelegt, während „CET“ saisonalen Änderungen folgt. pandas 3 verwendet die Python-Darstellung zoneinfo.
Einen bereits festgelegten Zeitpunkt umrechnen
aware.tz_convert("UTC") ergibt 07:00 Uhr UTC. Die Umrechnung desselben Zeitpunkts ergibt am 1. Juli für New York 03:00 Uhr, für Kolkata 12:30 Uhr, für Tokio 16:00 Uhr und für Sydney 17:00 Uhr. Die Uhrzeit ändert sich, der tatsächliche Zeitpunkt bleibt gleich.
| Operation | Erforderliche Eingabe | Was gleich bleibt |
|---|---|---|
tz_localize(zone) | Zeit ohne Zeitzoneninformation | Lokale Uhrzeit |
tz_convert(zone) | Zeit mit Zeitzoneninformation | Tatsächlicher Zeitpunkt |
Die Umrechnung eines Werts ohne Zeitzoneninformation löst einen Fehler aus, weil keine Ausgangszeitzone bekannt ist. Auch die Lokalisierung eines Werts mit Zeitzoneninformation löst einen Fehler aus; verwende dafür die Umrechnung. Verwende für Spalten .dt.tz_localize() und .dt.tz_convert(). Bei Indizes verwendest du die Methoden direkt oder die auf den Index bezogenen Methoden des DataFrames.
Text mit Zeitverschiebungen einlesen und Zeitzonen kombinieren
Ein „Z“ am Ende eines ISO-Textes bedeutet UTC. Lies Text mit unterschiedlichen Zeitverschiebungen mit utc=True ein:
raw = pd.Series(["2025-03-01 10:00+01:00",
"2025-04-01 10:00+02:00"])
common = pd.to_datetime(raw, utc=True)
Diese Werte werden zu 09:00 und 08:00 Uhr UTC. Rechne sie anschließend für lokale Berichte in eine regionale Zeitzone um. Das Einlesen gemischter Zeitverschiebungen ohne utc=True löst in pandas 3 einen Fehler aus.
Zwei Series mit Zeitzoneninformation werden anhand tatsächlicher Zeitpunkte ausgerichtet, selbst wenn ihre Zeitzonenbezeichnungen unterschiedlich sind. Amsterdamer Messwerte um 09:00 und 10:00 Uhr und Londoner Messwerte um 08:00 und 09:00 Uhr im Juli beziehen sich auf übereinstimmende Zeitpunkte. Ihr Rechenergebnis verwendet UTC-Bezeichnungen. Ordnungsvergleiche zwischen Zeitstempeln ohne und mit Zeitzoneninformation schlagen fehl; der Gleichheitsvergleich ergibt falsch.
Eine Zeitzone bewusst entfernen
tz_convert(None) drückt einen Wert mit Zeitzoneninformation zuerst in UTC aus und entfernt dann die Zeitzone. Aus 09:00 Uhr in Amsterdam werden im Juli 07:00 Uhr ohne Zeitzoneninformation. tz_localize(None) entfernt die Zeitzone und behält 09:00 Uhr ohne Zeitzoneninformation bei. Dies sind unterschiedliche Ausgaben. Bewahre Berechnungsdaten mit Zeitzoneninformation in UTC auf und rechne sie vor Berichten oder der Gruppierung nach einem lokalen Tag um.
Wichtige Erkenntnisse
- Lokalisiere Uhrzeiten ohne Zeitzoneninformation in der Zeitzone ihrer Erfassung.
- Rechne Zeitstempel mit Zeitzoneninformation um, um denselben Zeitpunkt anderswo anzuzeigen.
- Regionale IANA-Namen bewahren Sommerzeitregeln.
- Lies gemischte Zeitverschiebungen in eine gemeinsame UTC-Darstellung ein.
- Beim Entfernen einer Zeitzone kann die UTC-Zeit oder die lokale Uhrzeit erhalten bleiben.
6.2 Sommerzeit in Zeitreihen berücksichtigen
Lokale Uhren können eine Stunde überspringen oder wiederholen. Diese Umstellungen beeinflussen das Einlesen, verstrichene Zeitdauern und Tagessummen. Benannte Zeitzonen ermöglichen pandas, die tatsächlichen Zeitpunkte hinter lokalen Uhrzeiten zu unterscheiden.
Eine übersprungene Ortszeit erkennen
Amsterdam stellte am 30. März 2025 von 02:00 auf 03:00 Uhr vor. Die Uhrzeit 02:30 Uhr kam nie vor. Ihre Lokalisierung ohne Regel löst einen Fehler aus:
pd.Timestamp("2025-03-30 02:30").tz_localize(
"Europe/Amsterdam", nonexistent="shift_forward"
)
Das Ergebnis ist 03:00+02:00, die erste gültige Zeit nach der Lücke. nonexistent="NaT" hält das Problem als fehlenden Wert fest. "shift_backward" verschiebt auf den letzten gültigen Zeitpunkt vor der Lücke. Das Verschieben eines Datensatzes ändert seinen Zeitstempel, bewahre daher die ursprüngliche Eingabe auf und dokumentiere die gewählte Regel in der Analyse.
Zwei wiederholte Uhrzeiten unterscheiden
Am 26. Oktober 2025 stellte Amsterdam von 03:00 auf 02:00 Uhr zurück. Die lokale Uhrzeit 02:30 Uhr trat einmal mit der Zeitverschiebung +02:00 und einmal mit +01:00 auf. In UTC liegen sie eine Stunde auseinander.
ambiguous=True wählt das Auftreten in der Sommerzeit; ambiguous=False wählt die Normalzeit. ambiguous="NaT" markiert eine ungeklärte Uhrzeit als fehlend. Eine boolesche Liste kann die Wahl je Zeile treffen. ambiguous="infer" kann eine geordnete Folge mit der wiederholten Stunde nutzen, etwa 01:30, 02:00, 02:30, 02:00, 02:30, 03:00. Eine einzelne wiederholte Uhrzeit liefert nicht genügend Hinweise aus der Reihenfolge, um das gemeinte Auftreten zu ermitteln.
Stunden im lokalen Tag zählen
Der Tag der Frühjahrsumstellung hat 23 Stunden und der Tag der Herbstumstellung 25. Eine vollständige stündliche Zeitreihe hat daher beim Resampling auf lokale Tage unterschiedliche Anzahlen. Um den durchschnittlichen stündlichen Energieverbrauch anzugeben, dividiere eine Tagessumme durch die tatsächliche Anzahl gültiger Stundenmesswerte oder bilde deren Mittelwert. Jede Summe durch 24 zu dividieren, stellt die Umstellungstage falsch dar.
Auch ein unvollständiger Datensatz kann verkürzte Intervalle erzeugen. Eine UTC-Zeitreihe, die am 29. März um 00:00 Uhr beginnt, beginnt in Amsterdam um 01:00 Uhr, sodass ihrem ersten lokalen Tag schon vor dem Umstellungstag Mitternacht fehlt. Prüfe sowohl die Berichtsgrenzen als auch die Zeitzonenregeln.
Gleiche Uhrzeit und gleiche verstrichene Zeit unterscheiden
t = pd.Timestamp("2025-03-29 12:00", tz="Europe/Amsterdam")
t + pd.offsets.Day(1) # March 30 at 12:00
t + pd.Timedelta(days=1) # March 30 at 13:00
Der Kalenderoffset behält 12:00 Uhr bei und überbrückt nur 23 verstrichene Stunden. Das Timedelta addiert 24 Stunden. Im Herbst kann ein lokaler Kalendertag dagegen 25 verstrichene Stunden enthalten.
Vor dem Gruppieren die Berichtszeitzone wählen
Resampling folgt der Zeitzone des Index. Um den Verbrauch nach Amsterdamer Ortsdatum zu summieren, rechne zuerst einen UTC-Index mit Zeitzoneninformation in „Europe/Amsterdam“ um und führe dann Resampling auf „D“ durch. Resampling zuerst in UTC erzeugt andere Tagesgrenzen, die sich nicht allein durch eine neue Bezeichnung des Ergebnisses korrigieren lassen.
Umstellungsdaten unterscheiden sich je nach Region: New York stellte 2025 am 9. März und 2. November um; in Sydney endete die Sommerzeit am 6. April und begann am 5. Oktober. Tokio und Kolkata haben keine Sommerzeitumstellungen. Bewahre Rohzeitpunkte in UTC auf und verwende für Kalenderberichte die benannte lokale Zeitzone.
Wichtige Erkenntnisse
- Übersprungene und wiederholte Stunden benötigen ausdrückliche Lokalisierungsregeln.
- Eine mehrdeutige Ortszeit kann sich auf zwei verschiedene UTC-Zeitpunkte beziehen.
- Vollständige lokale Tage können 23 oder 25 Stunden enthalten.
- Rechne vor der Gruppierung nach lokalem Tag in die Berichtszeitzone um.
- Unterscheide Zeitumstellungen von unvollständiger Datenabdeckung.
Zeitreihen mit pandas: Beispiele
1Ein Textprotokoll in nutzbare Datumswerte umwandeln
11 Schritte
- 1EinführungMit einer Datumsspalte beginnen
Ein Zählerprotokoll enthält Datumsangaben als Text. Du benötigst Datumswerte, die pandas vergleichen kann, die verstrichene Zeit zwischen Einträgen und lesbare Bezeichnungen für einen Bericht. Das bedeutet einen Timestamp für jeden Zeitpunkt, ein Timedelta für die verstrichene Zeit und formatierten Text erst am Ende.
Gehe die Umwandlung vor der Berechnung durch. Eine Zeichenkette kann wie ein Datum aussehen, ohne sich wie ein Kalenderdatum zu verhalten, und ein mehrdeutiges Format kann ein plausibles Datum mit falscher Bedeutung ergeben.
- 2BeispielDie Konvention der Quelle lesen
Das Protokoll dokumentiert Datumsangaben mit dem Tag an erster Stelle und eine 24-Stunden-Uhr. Ein Eintrag lautet „14/03/2025 18:45“. Sein Format ist:
format="%d/%m/%Y %H:%M"Lies die Codes der Reihe nach: Tag, Monat, Jahr, Stunde und Minute.
%mund%Munterscheiden sich in der Groß- und Kleinschreibung, weil sie verschiedene Felder darstellen. Das Datum ist der 14. März, die Uhrzeit 18:45 Uhr. - 3ErklärungEin bekanntes Format anwenden
Wandle die Spalte mit dem dokumentierten Format um:
parsed = pd.to_datetime(raw, format="%d/%m/%Y %H:%M", errors="coerce")Das Format gilt für jeden nicht fehlenden Eintrag. Die Fehlerersetzung wandelt ungültige Eingaben in
NaTum. Ohne bekanntes Format ermittelt pandas es anhand der ersten nicht fehlenden Zeile; dadurch kann eine Quelle mit mehrdeutigen Datumsangaben mit Schrägstrichen falsch interpretiert werden. - 4HerausforderungTatsächliche Fehler zählen
Eine Spalte enthält „14/03/2025 18:45“, „bad“ und
None. Nach der Fehlerersetzung sind zwei ErgebnisseNaT. Wie viele vorhandene Werte konnten nicht eingelesen werden und welche Maske findet sie?---reveal---
Ein vorhandener Wert konnte nicht eingelesen werden: „bad“. Verwende
parsed.isna() & raw.notna(). Das ursprünglicheNonefehlte bereits. Würdest du jedesNaTzählen, würdest du die Anzahl fehlgeschlagener Umwandlungen überschätzen. - 5ErklärungZeitpunkte und Zeitdauern erkennen
Ein Timestamp stellt einen Zeitpunkt dar und eine Datums- und Zeitspalte enthält viele Zeitpunkte. Ein Timedelta stellt verstrichene Zeit dar.
Subtrahiere einen Anfangs-Timestamp von einem End-Timestamp, um eine Zeitdauer zu erhalten. Addiere ein Timedelta, um einen Zeitpunkt um eine feste Dauer zu verschieben.
NaTmarkiert fehlende Zeitangaben, sodass Rechnungen mit einem fehlenden Anfang oder Ende ebenfalls eine fehlende Zeitdauer ergeben. - 6BeispielDie beiden Zeitpunkte subtrahieren
Nimm diese Zeitstempel:
start = pd.Timestamp("2025-03-10 18:00") end = pd.Timestamp("2025-03-14 09:30") elapsed = end - startDas Ergebnis sind 3 Tage und 15:30 Stunden. Zähle zuerst die drei ganzen Tage und dann die verbleibenden 15 Stunden 30 Minuten. Behältst du das Ergebnis als Timedelta bei, kannst du im nächsten Schritt die gewünschte Berichtseinheit wählen, ohne den Rest zu verwerfen.
- 7BeispielDie vollständige Zeitdauer in Stunden umwandeln
Drei Tage entsprechen 72 Stunden. Der Rest beträgt 15,5 Stunden, sodass die Gesamtdauer 87,5 Stunden beträgt.
hours = elapsed / pd.Timedelta(hours=1)elapsed.daysergibt nur 3. Es beschreibt den Anteil ganzer Tage; würdest du diesen Anteil mit 24 multiplizieren, gingen 15,5 Stunden verloren.total_seconds()ergibt 315.000 und berücksichtigt ebenfalls die vollständige Zeitdauer. - 8HerausforderungEine nützliche Kalenderkomponente wählen
Ein Bericht benötigt die durchschnittlichen kWh nach Wochentag über viele Wochen. Welche Kalenderkomponente kann den Gruppierungsschlüssel liefern und benötigt eine Spalte
.dt?---reveal---
Verwende
df["timestamp"].dt.day_name()als Gruppierungsschlüssel und bilde dann den Mittelwert vonkwh. Eine Datums- und Zeitspalte benötigt.dt; ein DatetimeIndex stelltday_name()direkt bereit. Dies gruppiert wiederkehrende Wochentage, keine getrennten Kalenderdaten. - 9TippEinheiten vor dem Export als Ganzzahl prüfen
Ein Datums- und Zeittyp wie
datetime64[us]speichert Zählwerte in Mikrosekunden. Eine direkte Umwandlung in Ganzzahlen gibt diese Zählwerte zurück, selbst wenn älterer Code Nanosekunden erwartet.Fordere für eine Spalte ausdrücklich
s.dt.as_unit("ns").astype("int64")an, wenn Zählwerte in Nanosekunden benötigt werden. Behalte für Zeitdauervergleiche Timedelta-Rechnungen bei, damit die Einheit beim Wert bleibt. - 10HerausforderungDen abschließenden Bericht vorbereiten
Du hast Datumsangaben eingelesen und verstrichene Stunden berechnet. Der Bericht benötigt Datumsangaben wie „14 Mar 2025“. Solltest du die Datumsspalte vor dem Rechnen formatieren und welcher Ausdruck erzeugt die Bezeichnung?
---reveal---
Schließe zuerst die Datums- und Zeitrechnungen ab und verwende dann
parsed.dt.strftime("%d %b %Y")für Anzeigebezeichnungen. Die Formatierung gibt Text zurück. Der abgekürzte Monatsname richtet sich nach der Spracheinstellung des Systems; dieses Beispiel verwendet Englisch. - 11ZusammenfassungDie Darstellung nach dem Zweck wählen
Verwende Datums- und Zeitwerte für die Auswahl nach Kalenderangaben und für Rechnungen, Timedeltas für verstrichene Zeitdauern und formatierte Zeichenketten für abschließende Bezeichnungen. Beim Einlesen erhalten die Konventionen der Quelle eine Kalenderbedeutung.
Prüfe fehlgeschlagene nicht fehlende Eingaben, den Datentyp und gegebenenfalls benötigte Ausgabeeinheiten, bevor du eine umgewandelte Spalte weitergibst. So hat die spätere Analyse eine klare Zeitdarstellung als Grundlage.
2Einen bereinigten Verlauf erstellen und die richtigen Daten vergleichen
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungJeder Zeile eine klare zeitliche Zuordnung geben
- 2BeispielEinlesen, indizieren und sortieren
- 3TippWiederholte Ereignisse nach ihrer Bedeutung behandeln
- 4HerausforderungEin fehlendes Datum sichtbar machen
- 5ErklärungDie Genauigkeit einer Auswahl lesen
- 6HerausforderungEin wiederkehrendes Arbeitszeitfenster auswählen
- 7BeispielDen Vorgänger neben jeden Wert setzen
- 8KernaussageEine relative Änderung ist keine Prozentangabe
- 9ErklärungDaten für einen Kalendervergleich verschieben
- 10HerausforderungDie Ausrichtung anhand von Bezeichnungen nachvollziehen
- 11VerbindungDen Vorgänger jedes Geschäfts getrennt halten
- 12HerausforderungEinen Bericht zum täglichen Wachstum korrigieren
- 13ZusammenfassungBezeichnungen vor der Interpretation von Änderungen prüfen
3Kalender erstellen und vollständige Zeitspannen bezeichnen
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheiden, was ein Datum darstellen soll
- 2BeispielMonatsenddaten erzeugen
- 3TippDas Kürzel passend zum Kalender wählen
- 4HerausforderungDie Endpunkte einer Datumsfolge zählen
- 5BeispielVom 31. Januar um einen Monat verschieben
- 6ErklärungEinen bereits erreichten Ankerpunkt verstehen
- 7HerausforderungGeschäftszeit oder verstrichene Zeit wählen
- 8ErklärungMonatssummen mit Zeitspannen bezeichnen
- 9BeispielEin Datum in einen Monat und zurück umwandeln
- 10HerausforderungEine Geschäftsjahresbezeichnung lesen
- 11HerausforderungMonatliche Zeitpunkte oder monatliche Zeitspannen wählen
- 12ZusammenfassungDie Bedeutung durch die Kalenderregel ausdrücken
4Tages- und Monatsberichte aus Beobachtungen erstellen
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFragen, was die neue Frequenz bedeuten soll
- 2BeispielZwei Größen unterschiedlich aggregieren
- 3ErklärungEin Fünf-Minuten-Intervall nachvollziehen
- 4HerausforderungDie Beobachtung auf der Grenze verschieben
- 5TippLeere und unvollständige Intervalle prüfen
- 6BeispielEin feineres Tagesraster erstellen
- 7BeispielEine Lücke auf drei Arten füllen
- 8HerausforderungDas Bekannte bewahren
- 9KernaussageEin ausgewählter Zeitpunkt ist keine Summe
- 10BeispielGeschäfte in eigenen Intervallen halten
- 11HerausforderungEinen leeren Monat für ein Geschäft erklären
- 12HerausforderungEine Vergleichstabelle korrigieren
- 13ZusammenfassungLesen, was jede Ausgabezeile aussagt
5Die Beobachtungen in jedem Fenster verfolgen
16 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheiden, wie viel Verlauf relevant ist
- 2BeispielDas erste vollständige Zeilenfenster bilden
- 3BeispielDas Fenster um eine Zeile verschieben
- 4HerausforderungGültige Werte an den Positionen zählen
- 5TippErgebnisse zeitlich zutreffend platzieren
- 6ErklärungFür unregelmäßige Ereignisse verstrichene Zeit nutzen
- 7BeispielDie ausgeschlossene linke Grenze nachvollziehen
- 8HerausforderungGrenze und Mindestanzahl ändern
- 9KernaussageEin Monat ist keine feste Dauer für ein gleitendes Fenster
- 10BeispielDen gesamten bisherigen Verlauf behalten
- 11BeispielEinen Wert mit seinem früheren Höchstwert vergleichen
- 12BeispielEinen rekursiven gewichteten Mittelwert aktualisieren
- 13ErklärungDie Einstellung für die Anpassung lesen
- 14HerausforderungGewichtung vom jüngsten Wertepaar unterscheiden
- 15HerausforderungDen berücksichtigten Verlauf eines Berichts wählen
- 16ZusammenfassungDas Fenster vor dem Lesen des Ergebnisses bestimmen
6Zeitpunkte über Zeitzonen und Zeitumstellungen hinweg zuordnen
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Uhrzeit vom Zeitpunkt unterscheiden
- 2ErklärungEine Uhrzeit ohne Zeitzoneninformation lokalisieren
- 3BeispielEin Ereignis in mehrere Ortszeiten umrechnen
- 4TippRegionale Regeln beibehalten
- 5HerausforderungWählen, wie eine Zeitzone entfernt wird
- 6ErklärungEine übersprungene Uhrzeit im Frühjahr behandeln
- 7ErklärungZwei Auftreten im Herbst unterscheiden
- 8HerausforderungDie wiederholte Uhrzeit auflösen
- 9BeispielEinen vollständigen lokalen Tag zählen
- 10BeispielMorgen 12:00 Uhr von 24 Stunden unterscheiden
- 11HerausforderungDen lokalen Tagesbericht korrigieren
- 12ZusammenfassungZeitpunkt und Berichtsgrenze klar halten
Zeitreihen mit pandas: Übungsaufgaben
Set 1: Datumsangaben einlesen, auswählen und zusammenfassen10 Übungsfragen
Frage 1 von 10
Antwort zeigenAntwort ausblenden
.days-Komponente des Timedeltas lesen, blieben 24 Stunden erhalten und die übrigen 6,5 Stunden gingen verloren. Dividiere die Zeitdauer durch pd.Timedelta(hours=1), um die vollständige Dauer einzubeziehen.Frage 2 von 10
Antwort zeigenAntwort ausblenden
%d/%m/%Y den 7. November. %H:%M liest die Uhrzeit im 24-Stunden-Format und die Minuten. Das Einlesen mit dem Monat an erster Stelle würde den 11. Juli ergeben, ein gültiges Datum mit falscher Bedeutung. Deshalb reicht eine erfolgreiche Umwandlung allein nicht aus.Frage 3 von 10
Antwort zeigenAntwort ausblenden
sort_index() stellt die chronologische Reihenfolge her, die für eine zuverlässige Zeitauswahl benötigt wird. Das Entfernen von Dubletten würde das Problem nicht lösen, weil der angegebene Index keine wiederholten Zeitstempel enthält.Frage 4 von 10
.loc["2025-07-08 09:00":"2025-07-08 12:00"] aus?Antwort zeigenAntwort ausblenden
.iloc-Endposition behandelt, entfiele 12:00 Uhr und es ergäben sich drei. Datums- und Zeit-Slices nach Bezeichnung schließen beide Endpunkte ein, wenn passende Zeilen vorhanden sind.Frage 5 von 10
pd.date_range("2025-08-19", periods=3, freq="MS")?Antwort zeigenAntwort ausblenden
MS verlangt Monatsanfänge, sodass das erste passende Datum am oder nach dem 19. August der 1. September ist. Der 1. August liegt bereits vor dem angegebenen Anfang. Die Datumsfolge schließt den 19. August nicht allein deshalb ein, weil dieses Datum als Anfangsgrenze übergeben wurde.Frage 6 von 10
pd.DateOffset(months=1)?Antwort zeigenAntwort ausblenden
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Frage 9 von 10
s = pd.Series([3, 9, 6, 12]) der letzte Wert von s.rolling(3).mean()?Antwort zeigenAntwort ausblenden
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Set 2: Verläufe und Fensterergebnisse vergleichen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
.dt.day_of_week für eine Beobachtung am Sonntag zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
pct_change() für Mittwoch aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
freq="Q-SEP". Welche Zeitspanne beschreibt pd.Period("2026Q1", freq="Q-SEP")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
resample("5min", closed="right", label="right").sum() mit 10:05 bezeichnet?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
[2, NaN, 8, 14] die letzten beiden Ergebnisse von rolling(3, min_periods=2).mean()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
rolling("3D").sum() am 6. April?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
s / s.cummax() - 1?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Die passende Kalenderoperation wählen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
["2025-09-02", None, "2025-15-02", "bad"]. Sie wird mit format="%Y-%m-%d", errors="coerce" eingelesen. Wie viele vorhandene Quellwerte konnten nicht umgewandelt werden?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
.loc["2025-12-02":"2025-12-03"] aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
pd.date_range("2025-06-10", "2025-06-11", freq="6h") bei standardmäßiger Einbeziehung der Endpunkte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
.to_timestamp() zurück umgewandelt. Was geschieht mit den Bezeichnungen und ihrer Eindeutigkeit?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
pd.Grouper?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
rolling("3D", min_periods=2) mit Standardgrenzen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
ewm(span=3, adjust=False)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
ambiguous=True lokalisiert, der andere mit ambiguous=False. Wie groß ist ihr Abstand nach der Umrechnung in UTC?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Zeitreihenberechnungen untersuchen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
datetime64[us]. Ein Export benötigt ganzzahlige Zählwerte in Nanosekunden. Welcher Spaltenausdruck liefert diese Zählwerte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
1735689600000 in Millisekunden gespeichert. Welche Einleseargumente bewahren die angegebene Einheit und Zeitzone?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
a hat 30 am 1. August und 50 am 4. August. Du berechnest a - a.shift(1, freq="D"). Welche Werte erscheinen am 2. und 4. August?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
MonthEnd(0) und die Addition von MonthEnd(1) jeweils für einen Zeitstempel, der bereits auf dem 30. April 2025 liegt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
.asfreq("D", how="end") und anschließend mit .to_timestamp() unter Standardeinstellungen umgewandelt. Welcher Zeitstempel ergibt sich?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
freq="B" von Freitag, dem 12. September, bis Montag, dem 15. September 2025. Es werden keine benutzerdefinierten Feiertage angegeben. Welche Daten erscheinen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
asfreq("D"). Warum ist der ausgegebene Wert nicht die tägliche Energiesumme?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
rolling(5, center=True).mean() beziehungsweise das standardmäßig rückwärtsgerichtete rolling(5).mean()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
tz_convert(None) und tz_localize(None) in dieser Reihenfolge?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Zeitregeln in vollständigen Analysen kombinieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
["2025-12-02", "03/12/2025"] und dokumentiert Datumsangaben mit Schrägstrichen und dem Tag an erster Stelle. Welche Interpretation sollte die Bereinigung bewahren?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
pct_change()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
resample("D").sum(min_count=1) enthalten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Anzahl nicht fehlender Werte im Fenster
asfreq
asfreq() setzt eine Zeitreihe auf ein neues Raster, indem sie passende Zeitstempel auswählt, ohne dazwischenliegende Beobachtungen zu aggregieren.asfreq() auf stündlichen Daten behält Mitternachtsmesswerte, ohne die Werte des Tages zu addieren.Ausrichtung anhand von Zeitstempeln
B
Bezeichnungsbasierter Slice einschließlich beider Endpunkte
D
DateOffset
DatetimeIndex
.loc einen ganzen Berichtsmonat auszuwählen.Datumsfolge
Doppelter Zeitstempel
Downsampling
Drawdown
E
Einbeziehung der Endpunkte
Einleseformat
"%d/%m/%Y" liest „08/11/2025“ als 8. November statt als 11. August.Einlesen gemischter Datumsformate
Ermittelte Frequenz
Exponentiell gewichteter gleitender Mittelwert
F
Fenster mit fester Zeitdauer
Frequenzkürzel
"15min" erzeugt Viertelstundenbezeichnungen, während "ME" Monatsenden erzeugt.G
Geschäftsjahresquartal
Geschäftstagsfrequenz
Glättungsfaktor
Glättungsverzögerung
Gleitende Korrelation
Gleitendes Fenster
Gruppenweises Resampling
I
IANA-Zeitzonenname
Indizierung mit unvollständigen Datumszeichenketten
"2025-09" behält stündliche Beobachtungen im gesamten September.Intervallabschluss
Intervallbezeichnung
ISO 8601
K
Kalenderbasierte Maske
Kalendergebundene Frequenz
Kalendertag
Kumulative Summe
Kumulatives Maximum
L
Lineare Interpolation
Lokales Tagesintervall
Lücke im Zeitindex
M
Mehrdeutige Ortszeit
min_periods
min_periods legt fest, wie viele gültige Werte ein Fenster benötigt, bevor es ein Ergebnis liefert. Fehlende Zellen werden bei dieser Anzahl nicht mitgezählt.min_periods=2, aber nicht min_periods=3.Monatliche Wochentagsfrequenz
"WOM-3FRI" erzeugt wiederkehrende Daten am dritten Freitag jedes Monats.Monoton steigender Index
MonthEnd-Offset
MultiIndex
N
NaT
pd.isna() erkannt.NaT.Nicht existierende Ortszeit
Normalisierung von Datums- und Zeitwerten
O
Offene linke Intervallgrenze
OHLC
P
Period
Periodengrenze
PeriodIndex
R
Regel für die Zeitzonenlokalisierung
Relative Änderung
Resampling
Rückwärtsauffüllen
Rückwärtsgerichtetes Fenster
S
Sommerzeit
strftime
strftime wandelt Datums- und Zeitwerte mithilfe von Formatcodes in Anzeigetext um und ändert ihre Darstellung von Datums- und Zeitwerten in Zeichenketten.strftime „17 Aug 2025“ anzeigen.T
Tageszeitfenster
Timedelta
Timestamp
Typumwandlung mit Fehlerersetzung
NaT, sodass die Umwandlung abgeschlossen wird und ungültige Werte als fehlend markiert bleiben.U
Umformen mit unstack
Umwandlung der Periodenfrequenz
how="end" kann die letzte Tagesperiode eines Monats auswählen.Unix-Zeitstempel
unit="ms" verwenden, selbst wenn ein Zählwert in Sekunden ähnlich aussieht.Upsampling
UTC
UTC-Zeitverschiebung
V
Verzögerung
Vorlauf
shift(-1) ermöglicht es, in einer Tabelle jedes Ereignis mit dem nächsten erfassten Ereignis zu vergleichen.Vorwärtsauffüllen
Vorwärtsrollen
rollforward() eines Offsets findet den nächsten gültigen Kalenderankerpunkt am oder nach einem Datum und behält ein Datum bei, das bereits auf diesem Ankerpunkt liegt.rollforward() einer MonthEnd-Regel verschiebt den 15. Januar auf den 31. Januar desselben Jahres.W
Wachsendes Fenster
Z
Zeitbasierter Grouper
groupby Regeln für Zeitintervalle neben anderen Schlüsseln wie Geschäft oder Sensor bereitstellt.Zeitbasiertes Fenster
Zeitintervall
Zeitliche Auflösung
Zeitreihe
Zeitstempel mit Zeitzoneninformation
Zeitstempel ohne Zeitzoneninformation
Zeitzonenlokalisierung
Zeitzonenumrechnung
Zentriertes Fenster
Zurückrollen
rollback() eines Offsets findet den nächsten gültigen Kalenderankerpunkt am oder vor einem Datum und behält ein Datum bei, das bereits auf diesem Ankerpunkt liegt.rollback() einer MonthEnd-Regel verschiebt den 15. Januar auf den 31. Dezember des Vorjahres.#
.dt-Accessor
.dt-Accessor stellt Datums-, Zeit- und Zeitdauerfunktionen auf einer pandas-Spalte bereit, darunter Kalenderfelder, Rundung und Einheitenumwandlung..dt-Accessor in readings["time"].dt.hour liefert die erfasste Stunde für die Gruppierung.Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.