# 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:
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)
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)
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="M")
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)