Datumswerte sind keine Strings
Eine Preisreihe ist eine Zeitreihe: Wichtig ist, wann jeder Preis entstand. Aus einer Datei gelesene Daten sind einfache Strings, und ein String weiß nicht, dass der März nach dem Februar kommt oder ein Montag auf einen Sonntag folgt. Wandeln Sie sie mit pd.to_datetime um und verwenden Sie das Ergebnis als Index: Ein DatetimeIndex enthält echte Zeitstempel, die pandas sortieren, schneiden, vergleichen und zerlegen kann. Sortieren Sie ihn immer (sort_index()), damit die älteste Beobachtung zuerst kommt.
import pandas as pd
raw_dates = ["2026-03-04", "2026-03-02", "2026-03-03"] # strings, in a messy order
closes = [102.0, 100.0, 101.0]
series = pd.Series(closes, index=pd.to_datetime(raw_dates), name="close").sort_index()
print(series)
# 2026-03-02 100.0
# 2026-03-03 101.0
# 2026-03-04 102.0
# Name: close, dtype: float64
print(isinstance(series.index, pd.DatetimeIndex)) # TrueEinen Kalender erzeugen
Oft braucht man Daten, die niemand geliefert hat: ein Raster zum Vergleichen oder die Tage eines Backtests. pd.date_range(start, periods=n, freq="D") erzeugt n aufeinanderfolgende Kalendertage, und pd.bdate_range überspringt Wochenenden und liefert Geschäftstage. (Feiertage kennt es nicht.) Das Argument freq legt die Schrittweite fest: "D" ist ein Tag, "B" ein Geschäftstag, "h" eine Stunde.
# Four calendar days, then six business days (the weekend is skipped)
print(pd.date_range("2026-03-01", periods=4, freq="D").strftime("%a %d %b").tolist())
# ['Sun 01 Mar', 'Mon 02 Mar', 'Tue 03 Mar', 'Wed 04 Mar']
days = pd.bdate_range("2026-02-26", periods=6)
print(days.strftime("%a %d %b").tolist())
# ['Thu 26 Feb', 'Fri 27 Feb', 'Mon 02 Mar', 'Tue 03 Mar', 'Wed 04 Mar', 'Thu 05 Mar']Nach Datum auswählen
Bei einem sortierten DatetimeIndex versteht .loc als Strings geschriebene Daten. Ein Teilstring wie "2026-03" wählt den ganzen Monat, "2026" das ganze Jahr und "2026-03-04" einen einzelnen Tag. Ein Slice .loc["2026-03-04":"2026-03-06"] wählt einen Bereich, und anders als bei Positions-Slices sind beide Enden eingeschlossen. Die Enden müssen in den Daten nicht vorkommen: Wochenendtage passen einfach auf nichts, was man will, wenn man „alles ab dem Ersten des Monats“ verlangt.
prices = pd.Series(
[float(i) for i in range(20)],
index=pd.bdate_range("2026-02-23", periods=20), # Mon 23 Feb ... Fri 20 Mar
)
print(len(prices.loc["2026-03"])) # 15 the business days of March in the data
print(prices.loc["2026-03-04"]) # 7.0 a single day
print(prices.loc["2026-03-04":"2026-03-06"])
# 2026-03-04 7.0
# 2026-03-05 8.0
# 2026-03-06 9.0
# Freq: B, dtype: float64
print(prices.loc["2026-03-01":"2026-03-03"].tolist()) # [5.0, 6.0] Sunday the 1st matches nothingBestandteile eines Datums
Ein DatetimeIndex stellt die Bestandteile jedes Datums als Attribute bereit: year, month, day, dayofweek (Montag ist 0, Sonntag 6). Jedes ist ein Array mit einem Eintrag pro Zeile und taugt daher als Maske oder Gruppenschlüssel. So fragt man ohne Schleife „Wie viele Beobachtungen fallen auf jeden Wochentag?“ oder „Was passiert montags?“. Denken Sie daran, den Index vorher zu sortieren: Das Schneiden eines unsortierten DatetimeIndex kann überraschende Ergebnisse oder einen Fehler liefern.
# The parts of the dates, one entry per row
print(prices.index.dayofweek[:7].tolist()) # [0, 1, 2, 3, 4, 0, 1] Monday is 0
print(prices.index.month[:7].tolist()) # [2, 2, 2, 2, 2, 3, 3]
# How many observations fall on each weekday?
print(prices.groupby(prices.index.dayofweek).size().to_dict()) # {0: 4, 1: 4, 2: 4, 3: 4, 4: 4}
# What do the Mondays look like?
print(prices[prices.index.dayofweek == 0].tolist()) # [0.0, 5.0, 10.0, 15.0].loc["2026-03-04":"2026-03-06"] den 6. ein, bei Intraday-Daten endet es aber um 00:00 Uhr des 6. und verliert den ganzen Tag. Prüfen Sie den letzten Zeitstempel des Ergebnisses, wenn Ihre Daten feiner als ein Tag sind.pd.to_datetime(strings)erzeugt einen DatetimeIndex;sort_index()stellt das Älteste nach vorn;date_rangeundbdate_rangebauen Kalender..loc["2026-03"]wählt einen Monat,.loc["2026-03-04":"2026-03-06"]einen Bereich mit beiden Enden.index.year,index.month,index.dayofweekliefern die Bestandteile jedes Datums zum Filtern oder Gruppieren ohne Schleifen.
Als Nächstes: Resampling, das Tagespreise in Wochen-, Monats- oder feinere Balken verwandelt.
Lab: Was bewertet wird
- Mit
parse_priceseine Preisreihe mit Datum aufbauen25 Pkt. - Mit
prices_in_montheinen Monat auswählen25 Pkt. - Mit
prices_betweeneinen Datumsbereich auswählen25 Pkt. - Mit
count_by_weekdaydie Beobachtungen pro Wochentag zählen25 Pkt.