Kurs
Mit Datum und Uhrzeit zu arbeiten wirkt simpel – bis Formatvarianten, Zeitzonen, Sommerzeitregeln oder Zeitstempel aus mehreren Systemen ins Spiel kommen. Spätestens dann sind rohe Strings oder Integer als Zeitangabe keine Option mehr. Pythons datetime-Modul hilft dir, all diese beweglichen Teile verlässlich zu handhaben.
Dieser Guide führt dich durch die Kernklassen, zeigt, wie du datetime-Objekte erstellst und nutzt, wie du damit rechnest, Werte formatierst und parst, Zeitzonen behandelst und mehr. Jede Sektion baut auf der vorherigen auf, damit du von den Basics zu fortgeschritteneren Mustern gelangst.
Kernklassen des Python-datetime-Moduls
Bevor es konkret wird, lohnt sich ein Blick auf das Konzept dahinter: Das datetime-Modul nutzt eine kleine Anzahl an Klassen, die jeweils einen Teilaspekt abdecken. Wenn du weißt, wofür welche Klasse gedacht ist, wird der Rest deutlich einfacher.
date
Wenn du nur ein Kalenderdatum ohne Uhrzeit oder Zeitzone brauchst, ist die Klasse date das Richtige. Sie speichert Jahr, Monat und Tag über vertraute Attribute.
Die Attribute sind:
-
year -
month -
day
Und die Methoden:
-
today() -
fromisoformat() -
replace() -
isoformat() -
weekday() -
isoweekday()
from datetime import date
d = date(2025, 3, 1)
print(d)
Dieser Code erstellt ein einfaches Kalenderdatum. Wenn du eine ungültige Kombination eingibst (z. B. February 30), wirft Python einen ValueError.
time
Manche Aufgaben beziehen sich nur auf die Uhrzeit, etwa eine Erinnerung um 14:30 Uhr. Die Klasse time ist dafür hilfreich, denn sie speichert Stunden, Minuten, Sekunden und – falls nötig – Mikrosekunden oder Zeitzoneninformationen.
Die Attribute sind: hour, minute, second, microsecond, tzinfo
Die Methoden sind: replace(), isoformat()
from datetime import time
t = time(14, 30, 15)
print(t)
Das erzeugt eine Uhrzeit ohne Datum. Ungültige Werte (z. B. hour=27) führen zu einem Fehler.
datetime
Die meisten Praxisszenarien kombinieren Datum und Uhrzeit – hier kommt datetime ins Spiel. Es ist die vielseitigste Klasse im Modul und diejenige, die du für Logging, Verarbeitung und Koordination von Ereignissen am häufigsten verwenden wirst.
Die Attribute sind (zusätzlich zu den oben genannten): tzinfo
Und die Methoden sind now(), utcnow(), fromisoformat(), strptime(), strftime(), astimezone(). Außerdem unterstützt sie Arithmetik mit timedelta, darauf gehe ich gleich genauer ein.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Das erzeugt einen vollständigen Zeitstempel mit Datum und Uhrzeit.
timedelta
Immer wenn du verstrichene Zeit messen oder einen Zeitstempel verschieben willst, ist timedelta die richtige Wahl. Es repräsentiert eine Dauer, keinen konkreten Zeitpunkt.
Die Attribute sind: days, seconds, microseconds. Häufig genutzt für Offsets, Zeitdifferenzen und Planungslogik.
from datetime import timedelta
delta = timedelta(days=7, hours=3)
print(delta)
Das steht für eine feste Dauer. Besonders nützlich wird es, wenn du es zu einem datetime addierst oder davon subtrahierst.
tzinfo
tzinfo definiert Pythons Schnittstelle für Zeitzonen. Du erzeugst solche Objekte selten direkt, aber das datetime-System nutzt sie, sobald du Zeitzonen setzt oder konvertierst.
timezone
timezone ist eine eingebaute tzinfo-Implementierung für feste UTC-Offsets wie UTC oder UTC+1. Praktisch für einfache Fälle, in denen Sommerzeitregeln keine Rolle spielen.
Erstellen und Auslesen von Python-datetime-Objekten
Wenn die Klassen klar sind, geht es darum, Instanzen zu erzeugen. Python bietet mehrere Wege, je nachdem, woher deine Daten stammen: manuelle Eingabe, Systemzeit, Timestamps oder Text.
Konstruktoren verwenden
Konstruktoren geben dir die volle Kontrolle über die zu erstellenden Werte. Das ist oft der expliziteste und fehlertoleranteste Weg, um date-, time- oder datetime-Objekte zu bauen.
from datetime import date
d = date(2025, 3, 1)
print(d)
Das erzeugt direkt ein Kalenderdatum. Ungültige Werte lösen sofort einen Fehler aus und helfen, Fehler früh zu finden.
from datetime import time
t = time(14, 30, 15)
print(t)
Das liefert eine Uhrzeit. Nutze das, wenn du kein Datum brauchst.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Das erstellt einen vollständigen Zeitstempel. Mit einem tzinfo-Argument wird er zeitzonenbewusst.
Aus Timestamps erstellen
Unix-Zeitstempel tauchen in Logs, APIs und Betriebssystemen auf. Python wandelt sie leicht in menschenlesbare datetime-Objekte um.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Die erste Variante interpretiert den Zeitstempel in Lokalzeit, die zweite in UTC.
Klassenmethoden für aktuelle Werte
Wenn du das aktuelle Datum oder die aktuelle Uhrzeit brauchst, stellt Python einfache Helfer bereit. Unverzichtbar für Logging, Event-Tracking und Echtzeit-Pipelines.
from datetime import datetime, date, timezone
print(date.today())
print(datetime.now())
print(datetime.now(tz=timezone.utc)) # Python 3.12+ bevorzugt
Damit erhältst du die aktuelle Systemzeit – je nach Bedarf in Lokalzeit oder UTC.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Das wandelt Epoch-Zeitstempel in datetime-Objekte um. Sehr gängig beim Parsen von API- oder Datenbankwerten.
Aus Strings parsen
In echten Datensätzen werden Zeitstempel oft als Text gespeichert. Python bietet verlässliche Werkzeuge, um diese Strings in strukturierte Werte zu überführen.
strptime()
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
strptime() parst einen String anhand eines Formatmusters. Passt der String nicht exakt, wirft Python ValueError.
from datetime import datetime
dt = datetime.strptime("not-a-date", "%Y-%m-%d")
Das schlägt fehl, weil die Eingabe nicht zum erwarteten Muster passt.
fromisoformat()
datetime.fromisoformat("2025-03-01T14:30:00")
ISO-8601-Strings lassen sich sauber parsen, weil die Struktur standardisiert ist. Das ist oft der einfachste Weg, Zeitstempel aus APIs oder modernen Datenpipelines zu laden.
Mit Datum und Uhrzeit rechnen
Sobald du Zeitstempel erstellen kannst, willst du mit ihnen arbeiten: Dauern berechnen, Daten verschieben oder Intervalle vergleichen.
timedelta für zeitliche Berechnungen
timedelta modelliert Zeitspannen fester Länge wie „5 Stunden“ oder „2 Wochen“. Das ist nützlich für Scheduling, Logging oder einfache Countdowns.
from datetime import datetime, timedelta
dt = datetime(2025, 3, 1, 14, 30)
new_dt = dt + timedelta(days=5)
print(new_dt)
Dieses Beispiel verschiebt den Zeitstempel um fünf Tage nach vorn.
start = datetime(2025, 3, 1, 9, 0)
end = datetime(2025, 3, 1, 14, 30)
duration = end - start
print(duration.total_seconds())
Die Differenz zweier datetime-Objekte ergibt ein timedelta, das du in Sekunden, Tage oder Stunden umrechnen kannst.
Feste Dauer vs. kalenderbewusste Arithmetik
Nicht alle Zeiteinheiten sind gleich: Monate sind unterschiedlich lang, Jahre können Schalttage enthalten, und Monatsenden verhalten sich speziell. Für solche Fälle reicht timedelta nicht aus.
dateutil.relativedelta übernimmt „kalenderbewusste“ Arithmetik:
from dateutil.relativedelta import relativedelta
from datetime import date
d = date(2025, 1, 31)
print(d + relativedelta(months=1))
Das behandelt den fehlenden „31. Februar“ korrekt, indem das Datum passend verschoben wird.
Datumsangaben formatieren und parsen
Formatierung ist allgegenwärtig: APIs erwarten bestimmte Formate, Nutzer bevorzugen lesbaren Text, und Logs brauchen konsistente Zeitstempel-Strings. Python unterstützt sowohl flexible Formatierung als auch standardisierte Darstellungen.
String-Formatierung mit strftime
strftime() wandelt datetime-Objekte mithilfe vordefinierter Codes in formatierte Strings.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt.strftime("%A, %B %d, %Y at %H:%M"))
Das gibt einen gut lesbaren String mit Wochentag und vollem Monatsnamen aus.
dt.strftime("%Y-%m-%dT%H:%M:%S")
Das erzeugt einen ISO-ähnlichen String, geeignet für Datenspeicherung oder APIs.
Strings mit strptime parsen
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
Das wandelt Text in ein datetime-Objekt. Jegliche Abweichung zwischen String und Muster führt zu einem Fehler.
Mit ISO 8601 und RFC 3339 arbeiten
ISO 8601 löst die Mehrdeutigkeiten vieler regionaler Datumsformate. Python unterstützt es direkt:
from datetime import datetime
dt = datetime.fromisoformat("2025-03-01T14:30:00")
print(dt.isoformat())
Das ist das sicherste Format für den Austausch zwischen Systemen, APIs oder Datenbanken.
Mit Zeitzonen umgehen
Zeitzonen gehören zu den kniffligsten Themen in der Zeitverarbeitung. Python unterscheidet zwischen naiven und bewussten datetime-Objekten und bietet Werkzeuge für reale Zonenszenarien.
Naive vs. bewusste datetime-Objekte
Ein naives datetime hat keine Zeitzone:
from datetime import datetime
naive_dt = datetime(2025, 3, 1, 14, 30)
print(naive_dt.tzinfo) # None
Ein bewusstes datetime enthält einen Zeitzonenoffset:
from datetime import timezone, timedelta
aware_dt = naive_dt.replace(tzinfo=timezone(timedelta(hours=1)))
print(aware_dt)
Das Vermischen von naiven und bewussten Werten bei Vergleichen oder in Berechnungen führt in der Regel zu Fehlern.
Das zoneinfo-Modul verwenden
Pythons zoneinfo-Modul bietet Zugriff auf echte IANA-Zeitzonen:
from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30, tzinfo=ZoneInfo("Europe/Paris"))
print(dt)
Zeitzonenumrechnung ist einfach:
dt.astimezone(ZoneInfo("America/New_York"))
So drückst du denselben Zeitpunkt in einer anderen lokalen Zeitzone aus.
Zwischen Zeitzonen konvertieren
Du kannst jeden bewussten Zeitstempel mit astimezone() in eine andere Zone umwandeln:
from zoneinfo import ZoneInfo
dt_ny = dt.astimezone(ZoneInfo("America/New_York"))
print(dt_ny)
Ein gängiger Best Practice ist, Zeitstempel in UTC zu speichern und nur für die Anzeige zu konvertieren.
Daten vergleichen und filtern
Vergleiche tauchen in fast jedem Workflow auf: Sortieren von Logs, Filtern von Events oder die Frage, ob etwas vor oder nach einer Schwelle passiert ist.
from datetime import datetime
a = datetime(2025, 3, 1, 12, 0)
b = datetime(2025, 3, 1, 15, 0)
print(a < b) # True
Zeitzonenbewusste Vergleiche berücksichtigen Offsets:
from datetime import datetime
from zoneinfo import ZoneInfo
dt1 = datetime(2025, 3, 1, 12, 0, tzinfo=ZoneInfo("Europe/London"))
dt2 = datetime(2025, 3, 1, 7, 0, tzinfo=ZoneInfo("America/New_York"))
print(dt1 == dt2) # True — derselbe Zeitpunkt
Sammlungen zu filtern funktioniert ganz natürlich:
dates = [
datetime(2025, 3, 1, 10),
datetime(2025, 2, 20, 9),
datetime(2025, 3, 1, 8)
]
cutoff = datetime(2025, 3, 1)
filtered = [d for d in dates if d >= cutoff]
print(filtered)
Eine Normalisierung auf UTC ist hilfreich, wenn du über Zeitzonen hinweg arbeitest.
Weitere fortgeschrittene Anwendungsfälle
datetime begegnet dir in vielen Workflows über simples Parsing und Rechnen hinaus. Hier sind ein paar Muster, die häufig vorkommen.
Unix-Zeitstempel
Unix-Zeitstempel messen Sekunden seit dem 1. Januar 1970 (UTC). Sie sind in Systemprogrammierung und APIs weit verbreitet.
from datetime import datetime
dt = datetime.fromtimestamp(1700000000)
print(dt)
Millisekunden und Mikrosekunden müssen skaliert werden:
ts_ms = 1700000000000
dt_ms = datetime.fromtimestamp(ts_ms / 1000)
ts_us = 1700000000000000
dt_us = datetime.fromtimestamp(ts_us / 1_000_000)
Scheduling und Timer
Libraries wie schedule stützen sich auf datetime-Werte, um festzulegen, wann Tasks laufen. Ob du Funktionen alle paar Sekunden triggerst oder ein einmaliges Event später am Tag planst – datetime bildet die Grundlage dieser Vergleiche.
Datenanalyse-Muster
Häufig werden datetime-Attribute für Gruppierungen und zeitbasierte Analysen extrahiert:
dt = datetime(2025, 3, 1, 14, 30)
print(dt.year)
print(dt.isocalendar())
In pandas ist Resampling nach Perioden extrem verbreitet:
import pandas as pd
df = pd.DataFrame({
"value": [10, 12, 15],
"timestamp": pd.to_datetime([
"2025-03-01",
"2025-03-02",
"2025-03-08"
])
}).set_index("timestamp")
print(df.resample("W").sum())
Fazit
Wenn du mehr über datetime lernen möchtest, schau dir dieses Video aus unserem Kurs Working with Dates and Times in Python von Max Shrom und Data Types for Data Science in Python von Jason Myers an.
Nützlich ist auch unser Tutorial Converting Strings to Dates as datetime Objects, falls du zusätzliche Hilfe beim Konvertieren von Strings brauchst.
Technischer Redakteur, der sich auf KI, ML und Datenwissenschaft spezialisiert hat und komplexe Ideen verständlich und nachvollziehbar macht.
