Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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_datetime en date_range/bdate_range voor datumconstructies.
  • Resample naar gewenste frequentie en gebruik tijdsgebaseerde rolling vensters.
  • Beheer time zones expliciet; PeriodIndex voor periodieke data zoals maanden/kwartalen.