# invisible
import numpy as np
np.core.arrayprint._line_width = 65
Python, Pandas und Zeitserien¶
Einführung¶

In unserem nächsten Kapitel des Pandas-Tutorial behandeln wir Time Series. Eine Time Series ist eine Reihe von Datenpunkten, welche in chronologischer (zeitlicher) Reihenfolge gelistet (indiziert) sind. Für gewöhnlich ist eine Time Series eine Sequenz von Werten, mit gleichen zeitlichen Abständen.
Alle gemessenen Daten, die auch mit einem bestimmten Zeitpunkt in Verbindung stehen, können als Time Series angesehen werden. Messungen können durchaus unregelmäßig sein, haben aber in den meisten Fällen eine feste Frequenz bzw. Regelmässigkeit. D.h. dass Daten bspw. alle 5 Millisekunden, alle 10 Sekunden oder jede Stunde erhoben werden. Time Series werden oft in Liniencharts dargestellt.
Bevor Sie fortfahren möchten wir ihnen noch unser Tutorial empfehlen zum Thema Time Processing mit Standard Python-Modulen, wie z.B. datetime, time und calendar.
Wir wollen in diesem Kapitel die Pandas-Tools vorstellen, um mit Time Series umzugehen. Sie werden also lernen, mit großen Time Series zu arbeiten und diese zu modifizieren:
Zeitreihen und Python¶
Wir können eine Pandas-Series definieren, welche als Index eine Reihe von Zeitstempeln enthält:
import numpy as np
import pandas as pd
from datetime import datetime, timedelta as delta
ndays = 10
start = datetime(2018, 12, 1)
dates = [start - delta(days = x) for x in range(0, ndays)]
values = [25, 50, 15, 67, 70, 9, 28, 30, 32, 12]
ts = pd.Series(values, index = dates)
print(ts)
Datumsfolgen mit pd.date_range¶
Mit pd.date_range() lassen sich regelmäßige Datums- und Zeitindizes erzeugen. Die wichtigsten Parameter sind start, end, periods, freq und inclusive.
pd.date_range(start="2026-01-01", periods=5, freq="D")
Für Monatsenden verwendet aktuelles pandas den Alias "ME" (month end). Ältere Beispiele verwenden häufig "M"; dieser Alias wurde in pandas 3.0 entfernt. Analog wurden beispielsweise "Q" durch "QE" und "Y" durch "YE" ersetzt.
Mit inclusive="left", "right", "both" oder "neither" lässt sich steuern, welche Randwerte in einem durch start und end definierten Bereich enthalten sind.
Wir ermitteln den Typ der soeben erstellten Time-Series:
print(type(ts))
Was wir erzeugt haben, ist eine Zeitreihe oder Time-Series, weil es auf den Series von Pandas basiert. Wie sieht der Index dieser Time-Series aus? Wir sehen es hier:
print(ts.index)
Wir erstellen eine weitere Time-Series:
values2 = [32, 54, 18, 61, 72, 19, 21, 33, 29, 17]
ts2 = pd.Series(values2, index=dates)
Es ist möglich, arithmetische Operationen auf Zeitreihen durchzuführen, wie bei anderen Series-Objekten auch. Als Beispiel addieren wir die beiden zuvor erstellten Time-Series:
print(ts + ts2)
Arithmetischer Durchschnitt der beiden Series-Objekte:
print((ts + ts2) / 2)
Dies kann auch mit Series-Objekten gemacht werden, die eine andere Indexierung haben.
import pandas as pd
from datetime import datetime, timedelta as delta
ndays = 10
start = datetime(2018, 6, 1)
dates = [start - delta(days=x) for x in range(0, ndays)]
start2 = datetime(2018, 5, 28)
dates2 = [start2 - delta(days=x) for x in range(0, ndays)]
values = [25, 50, 15, 67, 70, 9, 28, 30, 32, 12]
values2 = [32, 54, 18, 61, 72, 19, 21, 33, 29, 17]
ts = pd.Series(values, index = dates)
ts2 = pd.Series(values2, index = dates2)
print(ts + ts2)
Datumsbereiche erstellen¶
Die Methode date_range() aus dem Pandas-Modul kann für die Erstellung eines Datumsstempel-Index verwendet werden:
import pandas as pd
index = pd.date_range('12/24/1970', '01/03/1971')
print(index)
Wir haben ein Start- und ein Ende-Datum an die date_range-Methode übergeben. Ebenso ist es möglich, nur einen Start oder nur ein Ende zu übergeben. In diesem Fall muss jedoch die Anzahl der Perioden, über den Schlüsselwort-Parameter periods, angegeben werden:
index = pd.date_range(start='12/24/1970', periods=7)
print(index)
index = pd.date_range(end='12/24/1970', periods=7)
print(index)
Ebenso ist es möglich Zeitreihen zu erstellen, welche nur die Arbeitstage beinhalten. Dazu muss der Schlüsselwortparameter freq auf B gesetzt werden:
index = pd.date_range('2017-04-07', '2017-04-13', freq="B")
print(index)
Im nächsten Beispiel generieren wir eine Zeitreihe, welche die Monatsenden zwischen zwei Zeitpunkten enthält. Dabei sehen wir, dass das Jahr 2016 den 29. Februar hatte, weil es ein Schaltjahr war:
index = pd.date_range('2016-02-25', '2016-07-02', freq="ME")
print(index)
Weitere Abkürzungen:
| Alias | Description |
|---|---|
| B | business day frequency |
| C | custom business day frequency (experimental) |
| D | calendar day frequency |
| W | weekly frequency |
| M | month end frequency |
| BM | business month end frequency |
| MS | month start frequency |
| BMS | business month start frequency |
| Q | quarter end frequency |
| BQ | business quarter end frequency |
| QS | quarter start frequency |
| BQS | business quarter start frequency |
| A | year end frequency |
| BA | business year end frequency |
| AS | year start frequency |
| BAS | business year start frequency |
| H | hourly frequency |
| T | minutely frequency |
| S | secondly frequency |
| L | milliseconds |
| U | microseconds |
index = pd.date_range('2017-02-05', '2017-04-13', freq="W-Mon")
print(index)
