Dates et séries temporelles
Les données temporelles soulèvent au moins quatre questions indépendantes : l'instant, le fuseau horaire, la fréquence calendaire et la sémantique des intervalles. Rendez chacune explicite.
Types fondamentaux
Timestamp: un instant.DatetimeIndex: un index d'horodatages.Timedelta: une durée écoulée.Period: une période calendaire telle qu'un mois ou un trimestre.DateOffset: un déplacement calendaire tel qu'une fin de mois ou un jour ouvré.
Analyser à la frontière
import pandas as pd
events = pd.DataFrame({
"occurred_at": ["2026-01-01T12:00:00+0000", "2026-01-03T12:00:00+0000"],
"value": [10, 30],
})
events["occurred_at"] = pd.to_datetime(
events["occurred_at"],
format="%Y-%m-%dT%H:%M:%S%z",
errors="coerce",
utc=True,
)
Un format explicite facilite le raisonnement et prévient les ambiguïtés régionales. Traitez les échecs d'analyse convertis comme des événements de qualité des données et examinez-les.
Fuseaux horaires
tz_localizeattache un fuseau à des lectures d'horloge locale naïves.tz_convertconvertit des instants déjà associés à un fuseau vers un autre.
Stockez si possible les instants en UTC et convertissez-les pour l'affichage. Les changements d'heure créent des heures locales ambiguës ou inexistantes ; choisissez une règle au lieu d'ignorer le problème.
Index et rééchantillonnage
assert events["occurred_at"].notna().all()
series = events.set_index("occurred_at")["value"].sort_index()
daily = series.resample("D").sum(min_count=1)
rolling_7d = series.rolling("7D").mean()
resample regroupe les observations en intervalles calendaires. rolling calcule des fenêtres autour
des observations. Leurs paramètres répondent à des questions différentes ; l'un n'est pas le raccourci de l'autre.
Pour les étiquettes d'intervalle, précisez les limites et l'étiquetage (closed, label et, le cas échéant,
l'origine) lorsque les valeurs par défaut influencent l'interprétation.
Plages calendaires et périodes
month_ends = pd.date_range("2026-01-01", periods=6, freq="ME", tz="UTC")
quarters = month_ends.tz_localize(None).to_period("Q")
Utilisez les périodes lorsque l'objet est un intervalle calendaire plutôt qu'un instant précis.
Intervalles calendaires et fenêtres temporelles
Les totaux quotidiens valent 10, manquant, 30 du 1er au 3 janvier : min_count=1 conserve l’absence du jour vide. Le résultat glissant ne contient que les deux instants observés, avec les moyennes 10 et 20. "7D" prend les observations des sept jours précédents, en excluant par défaut la borne gauche ; rolling(7) compte sept observations et exige par défaut sept valeurs valides. Une fenêtre temporelle exige un index datetime monotone sans NaT.
Pour les valeurs datetime d’une Series, utilisez .dt.tz_localize(...) et .dt.tz_convert(...) ; les méthodes sans .dt agissent sur son index. to_datetime(..., utc=True) interprète les chaînes naïves en UTC, pas en heure locale. Un Timedelta de 24 heures représente une durée écoulée ; un DateOffset d’un jour conserve l’heure locale lors d’un changement d’heure et peut durer 23 ou 25 heures.
Le guide temporel distingue fréquences calendaires et périodes. "ME" désigne la fin de mois depuis pandas 2.2. Les périodes ne gardent pas les fuseaux : l’exemple retire volontairement UTC en conservant les lectures d’horloge UTC avant conversion en trimestres. Convertissez d’abord vers le fuseau métier si celui-ci détermine le trimestre.