Hoofdstuk 17 — Tijdsreeksen en datum/tijd in pandas
Let op: De tekst is in het Nederlands; alle Python codevoorbeelden zijn in het Engels.
Doel van dit hoofdstuk:
- Datums en tijden correct parsen, opslaan en formatteren.
- Indexeren en resamplen van tijdreeksen; frequenties en offsets.
- Rolling/expanding op tijdsgebaseerde vensters; time zone handling.
- Use‑cases: kalenderfeatures, business‑dagen, periode‑objecten.
Aanbevolen voorkennis: Hoofdstuk 13–16.
17.1 Datums parsen en dtypes
import pandas as pd
import numpy as np
s = pd.Series(['2025-01-01', '2025-01-02', '2025-02-15'])
dates = pd.to_datetime(s, format='%Y-%m-%d')
# Datetime64[ns]
assert str(dates.dtype).startswith('datetime64')
# Tijdsdelta
delta = pd.to_timedelta(["1D", "12H", "30min"]) # dagen, uren, minuten
17.2 DatetimeIndex en frequenties
# Reeks met dagelijkse frequentie
ts = pd.Series(np.arange(5), index=pd.date_range('2025-01-01', periods=5, freq='D'))
# Subselectie op datum
jan = ts['2025-01']
specific = ts['2025-01-03']
# Herindexeren naar een andere frequentie
hourly = ts.resample('H').ffill() # upsample met forward‑fill
17.3 Resampling en aggregaties
rng = pd.date_range('2025-01-01', periods=1000, freq='H')
vals = pd.Series(np.random.default_rng(0).standard_normal(len(rng)), index=rng)
# Dagelijkse som en gemiddelde
by_day = vals.resample('D').agg(['sum','mean'])
# Business‑day frequentie met eind van de maand
month_end = vals.resample('M').mean()
17.4 Time‑based rolling windows
# Tijdsvenster van 7 dagen, min 1 observatie
roll7 = vals.rolling('7D', min_periods=1).mean()
17.5 Time zones (tz‑aware)
utc = pd.to_datetime(['2025-01-01 12:00', '2025-06-01 12:00'], utc=True)
# Convert naar Europa/Amsterdam
ams = utc.tz_convert('Europe/Amsterdam')
# Lokale naive -> lokaliseer eerst, dan converteren
naive = pd.to_datetime(['2025-01-01 12:00'])
ams_local = naive.tz_localize('Europe/Amsterdam')
17.6 Periodes en PeriodIndex
# Maandperioden
p = pd.period_range('2025-01', '2025-06', freq='M')
series_p = pd.Series(range(len(p)), index=p)
# Conversie tussen Timestamp en Period via asfreq / to_period
monthly = ts.to_period('M')
daily_back = monthly.to_timestamp(how='end')
17.7 Kalenderfeatures en business-dagen
# Weekdag, maand, jaar als features
features = pd.DataFrame({'date': pd.date_range('2025-01-01', periods=10, freq='D')})
features['weekday'] = features['date'].dt.weekday
features['is_month_end'] = features['date'].dt.is_month_end
# Business Day offset
bdr = pd.bdate_range('2025-01-01', periods=5)
17.8 Veelvoorkomende valkuilen
- Mixing naive (tz‑naive) en tz‑aware timestamps geeft fouten; maak alles tz‑aware of hou het consistent naive.
- Resampling vereist een datumindex; zet eerst
set_index('date'). - Herken DST‑overgangen bij tz‑convert/localize; sommige tijden bestaan dubbel of niet.
17.9 Samenvatting
- Gebruik
to_datetimeendate_range/bdate_rangevoor datumconstructies. - Resample naar gewenste frequentie en gebruik tijdsgebaseerde rolling vensters.
- Beheer time zones expliciet; PeriodIndex voor periodieke data zoals maanden/kwartalen.