Python-String in ein Datetime-Objekt umwandeln
Wenn ein Zeitstempel als String immer demselben Aufbau folgt, kannst du ihn mit datetime.strptime() in ein datetime-Objekt umwandeln. Für ISO-formatierte Zeichenfolgen aus APIs oder Logs eignet sich datetime.fromisoformat().
from datetime import datetime
dt = datetime.strptime("2024-06-15 10:30:00", "%Y-%m-%d %H:%M:%S")
print(dt) # 2024-06-15 10:30:00
strptime() liefert ein Objekt vom Typ datetime.datetime zurück. Dieses kannst du beispielsweise vergleichen, voneinander subtrahieren oder an strftime() übergeben. Wenn die Struktur der Eingabewerte unterschiedlich ist, kannst du python-dateutil installieren und dateutil.parser.parse() verwenden.
In diesem Leitfaden werden alle drei Parsing-Methoden behandelt. Außerdem geht es um wichtige Format-Direktiven, Zeitzonen, Fehlerbehandlung und time.strptime() für ältere Arbeitsabläufe, die eine Ausgabe vom Typ struct_time benötigen.
Python-Anwendungen aus GitHub lassen sich über eine verwaltete Anwendungsplattform bereitstellen, wobei die Hosting-Plattform die Skalierung der Anwendung übernehmen kann.
Python-String in Datetime umwandeln: Die wichtigsten Punkte
datetime.strptime(string, format)setzt ein fest definiertes Format voraus. Beide Argumente werden als Strings angegeben.datetime.fromisoformat(string)eignet sich ab Python 3.11 für ISO-8601-Werte wie2024-06-15T10:30:00+05:30.dateutil.parser.parse(string)versucht, das Format selbstständig zu erkennen. Diese Methode ist für Benutzereingaben praktisch, aber weniger geeignet für CSV-Dateien mit Millionen von Zeilen.strftime()erzeugt aus einemdatetime-Objekt einen String. Als Merkhilfe gilt: parse steht fürstrptime, während format zustrftimegehört.- Mit
.date()und.time()kannst du jeweils die nicht benötigten Bestandteile eines Datums- und Zeitwertes entfernen. - Ein nicht passendes Format führt zu einem
ValueError. Behandle solche Fälle mittry/exceptoder teste mehrere Format-Strings nacheinander in einer Schleife. %zverarbeitet Zeitzonen-Offsets wie+0530. Ab Python 3.11 akzeptiertfromisoformat()auch Schreibweisen wie+05:30mit Doppelpunkt.time.strptime()gibt einstruct_time-Objekt zurück. In den meisten Anwendungen istdatetime.strptime()jedoch die bessere Wahl.- Python 3.12 und 3.13 unter Ubuntu 24.04 LTS verwenden diese APIs weiterhin auf dieselbe Weise. Nutze zunächst die Standardbibliothek, bevor du zusätzliche Pakete einbindest.
Voraussetzungen für das Parsen von Datetime-Strings in Python
- Python 3.8 oder neuer. Ab Python 3.11 steht die umfangreichste Unterstützung für
fromisoformat()zur Verfügung. - Grundkenntnisse im Umgang mit Strings und dem datetime-Modul.
- Optional:
python-dateutil. Die Installation erfolgt überpip:
pip install python-dateutil
Die passende Methode zum Parsen von Datetime-Werten auswählen
| Methode | Format-String erforderlich | Abhängigkeit | Zeitzonenfähig | Geeignet für |
|---|---|---|---|---|
datetime.strptime() |
Ja | Standardbibliothek | Mit %z |
Logs, CSV-Dateien und feste Formate |
datetime.fromisoformat() |
Nein | Standardbibliothek | Ja (3.11+) | ISO-Zeitstempel aus JSON und APIs |
dateutil.parser.parse() |
Nein | python-dateutil |
Häufig | Gemischte Formate und menschenlesbare Datumsangaben |
time.strptime() |
Ja | Standardbibliothek | Eingeschränkt | Ältere C-ähnliche Arbeitsabläufe mit struct_time |
Häufig verwendete strptime()-Format-Direktiven in Python
| Direktive | Bedeutung | Beispieleingabe | Interpretierter Wert |
|---|---|---|---|
%Y |
Vierstellige Jahreszahl | 2024 |
2024 |
%y |
Zweistellige Jahreszahl | 24 |
2024 |
%m |
Monat (01-12) | 06 |
Juni |
%d |
Tag (01-31) | 15 |
15. Tag |
%H |
Stunde im 24-Stunden-Format (00-23) | 14 |
14 Uhr |
%I |
Stunde im 12-Stunden-Format (01-12) | 02 |
2 in Verbindung mit %p |
%M |
Minute | 30 |
30 |
%S |
Sekunde | 00 |
0 |
%f |
Mikrosekunde | 123456 |
123456 µs |
%p |
AM/PM | PM |
Nachmittag |
%z |
UTC-Offset | +0530 |
+5:30 |
%Z |
Name der Zeitzone | UTC |
Name, abhängig von der Plattform |
%A / %a |
Vollständiger oder abgekürzter Wochentag | Friday / Fri |
Wochentag |
%B / %b |
Vollständiger oder abgekürzter Monatsname | June / Jun |
Monat |
Eine vollständige Übersicht findest du in der Dokumentation zu den Format-Codes von strftime() und strptime().
Methode 1: Python-Strings mit datetime.strptime() parsen
datetime.strptime(date_string, format) gleicht die angegebenen Format-Direktiven mit der Zeichenfolge ab und erzeugt daraus ein datetime-Objekt.
Datums- und Zeit-String parsen
from datetime import datetime
datetime_str = '09/19/22 13:55:26'
datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S')
print(type(datetime_object))
print(datetime_object)
Ausgabe:
<class 'datetime.datetime'>
2022-09-19 13:55:26
Nur date oder time auslesen
from datetime import datetime
date_str = '09-19-2022'
date_object = datetime.strptime(date_str, '%m-%d-%Y').date()
print(date_object) # 2022-09-19
time_str = '13:55:26'
time_object = datetime.strptime(time_str, '%H:%M:%S').time()
print(time_object) # 13:55:26
mm dd yyyy und ISO-ähnliche Strings parsen
from datetime import datetime
print(datetime.strptime("12 25 2024", "%m %d %Y"))
print(datetime.strptime("2024-12-25", "%Y-%m-%d"))
# Dreistellige Millisekunden werden mit %f (Mikrosekunden) verarbeitet. Python ergänzt Nullen.
print(datetime.strptime("2024-06-15 10:30:00.123", "%Y-%m-%d %H:%M:%S.%f"))
Ausgabe:
2024-12-25 00:00:00
2024-12-25 00:00:00
2024-06-15 10:30:00.123000
Methode 2: ISO-Strings mit fromisoformat() parsen
datetime.fromisoformat() kann viele ISO-8601-Zeichenfolgen direkt interpretieren, ohne dass ein Format-String manuell angegeben werden muss. Solche Zeitstempel kommen häufig in REST-APIs und Datenbanken vor.
from datetime import datetime
print(datetime.fromisoformat("2024-06-15T10:30:00"))
print(datetime.fromisoformat("2024-06-15T10:30:00+05:30"))
Ausgabe:
2024-06-15 10:30:00
2024-06-15 10:30:00+05:30
Hinweise zu den Python-Versionen:
- 3.7+: Unterstützt
YYYY-MM-DDund grundlegende Varianten mitTals Trennzeichen. - 3.11+: Unterstützt zusätzliche ISO-Varianten einschließlich mehrerer Zeitzonenformate.
- 3.6-3.10: Unterstützt eine kleinere Auswahl. Bei ungewöhnlich formatierten Strings kann
dateutil.parser.parse()verwendet werden.
Ein String, der auf Z endet, steht für UTC. Bei älteren Python-Versionen kannst du Z vor dem Parsen durch +00:00 ersetzen:
s = "2024-06-15T10:30:00Z"
dt = datetime.fromisoformat(s.replace("Z", "+00:00"))
Methode 3: Flexible Datums- und Zeitwerte mit dateutil parsen
Wenn einzelne Zeilen unterschiedliche Formate verwenden, kann dateutil.parser.parse() versuchen, deren Aufbau automatisch zu erkennen:
from dateutil import parser
print(parser.parse("Jun 1 2005 1:33PM"))
print(parser.parse("2024-06-15"))
Führe zunächst pip install python-dateutil aus.
parse() benötigt bei sehr großen Dateien mehr Rechenleistung, da das Paket jeden einzelnen String analysiert. Wenn alle Zeilen denselben Aufbau besitzen, ist strptime() die geeignetere Methode.
Menschenlesbare Datumsangaben mit festem Format parsen
Für Jun 1 2005 1:33PM wird dateutil nicht zwingend benötigt. Stattdessen kann der Aufbau ausdrücklich als Format angegeben werden:
from datetime import datetime
s = "Jun 1 2005 1:33PM"
dt = datetime.strptime(s, "%b %d %Y %I:%M%p")
print(dt)
Ausgabe:
2005-06-01 13:33:00
Vor %p steht kein Leerzeichen, weil im Eingabestring PM unmittelbar auf die Minuten folgt.
Python-Datetime-Strings mit Zeitzonen-Offsets parsen
Für einen numerischen Zeitzonen-Offset kannst du strptime() zusammen mit %z verwenden. Im folgenden Beispiel enthält der Offset keinen Doppelpunkt:
from datetime import datetime
dt = datetime.strptime("2024-06-15 10:30:00+0530", "%Y-%m-%d %H:%M:%S%z")
print(dt) # timezone-aware
Ab Python 3.11 kann ein ISO-Offset mit Doppelpunkt direkt über fromisoformat() verarbeitet werden:
from datetime import datetime
dt = datetime.fromisoformat("2024-06-15T10:30:00+05:30")
Benannte Zeitzonen wie America/New_York benötigen zoneinfo, das seit Python 3.9 zur Standardbibliothek gehört. Parse zunächst die lokale Zeit ohne Zeitzoneninformationen und weise anschließend die gewünschte Zone zu.
ValueError und mehrere Datetime-Formate behandeln
Zusätzlicher Text oder ein nicht passendes Format führt dazu, dass Python einen ValueError auslöst:
from datetime import datetime
datetime_str = '09/19/18 13:55:26'
try:
datetime.strptime(datetime_str, '%m/%d/%y')
except ValueError as err:
print(err) # unconverted data remains: 13:55:26
Wenn mehrere mögliche Formate existieren, kannst du sie nacheinander prüfen, bis eines erfolgreich verarbeitet wird:
from datetime import datetime
def parse_flexible(value: str):
formats = ("%Y-%m-%d", "%m/%d/%Y", "%d-%m-%Y")
for fmt in formats:
try:
return datetime.strptime(value, fmt)
except ValueError:
continue
raise ValueError(f"no format matched: {value!r}")
print(parse_flexible("2024-06-15"))
Wenn eine Zeile nicht geparst werden kann, solltest du den ursprünglichen String in den Logs festhalten. Dadurch lassen sich fehlerhafte Daten schneller erkennen und korrigieren.
Python-datetime mit strftime() wieder in einen String umwandeln
strftime() führt die umgekehrte Operation von strptime() aus: Ein Objekt wird wieder in eine Zeichenfolge umgewandelt.
from datetime import datetime
date_object = datetime.strptime("12 25 2024", "%m %d %Y")
print(date_object.strftime("%Y-%m-%d")) # 2024-12-25
print(date_object.strftime("%d, %m, %Y")) # 25, 12, 2024
Diese Methode eignet sich beispielsweise für Dateinamen im Format yyyy-mm-dd, SQL-Literale oder JSON-Felder.
Strings mit time.strptime() und struct_time parsen
Das time-Modul stellt time.strptime() bereit. Als Ergebnis erhältst du ein Tupel vom Typ time.struct_time und kein datetime-Objekt:
import time
time_str = 'Mon Dec 12 14:55:02 2022'
time_obj = time.strptime(time_str) # default format
print(time_obj.tm_year, time_obj.tm_mon, time_obj.tm_mday)
Wenn kein Format angegeben wird, erwartet Python standardmäßig '%a %b %d %H:%M:%S %Y'.
Falls du ein datetime-Objekt benötigst, kannst du es aus dem Tupel erzeugen:
from datetime import datetime
import time
struct = time.strptime("Mon Dec 12 14:55:02 2022")
print(datetime(*struct[:6]))
Bei neuen Projekten sollte datetime.strptime() in der Regel die bevorzugte Methode sein.
Datumsspalten mit Pandas parsen
pandas.to_datetime() kann eine vollständige Spalte auf einmal konvertieren. Du kannst format ähnlich wie bei strptime angeben oder format=None verwenden, damit Pandas versucht, das Format selbst zu bestimmen:
import pandas as pd
df = pd.DataFrame({"logged_at": ["2024-06-15", "2024-06-16"]})
df["logged_at"] = pd.to_datetime(df["logged_at"], format="%Y-%m-%d")
print(df.dtypes)
Wenn eine einzelne Spalte unterschiedliche Formate enthält, kannst du errors="coerce" setzen. Ungültige Zeilen werden dann als NaT behandelt, anstatt den gesamten Vorgang abzubrechen. Wenn du noch nicht mit DataFrames vertraut bist, kannst du mit einem Pandas-Grundlagentutorial beginnen.
Gebietsspezifische Monatsnamen parsen
Monatsnamen in anderen Sprachen als Englisch benötigen eine entsprechende Locale, die auf dem Betriebssystem verfügbar sein muss:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
dt = datetime.strptime('16-Dezember-2022', '%d-%B-%Y')
print(dt)
Falls setlocale nicht funktioniert, installiere das benötigte Sprachpaket oder verwende englische Monatsnamen und verarbeite sie mit %B oder %b.
Häufig gestellte Fragen zur Umwandlung von Python-Strings in Datetime
1. Wie lässt sich ein String in Python in Datetime umwandeln?
Rufe datetime.strptime() auf und übergib einen passenden Format-String:
from datetime import datetime
dt = datetime.strptime("2024-12-25", "%Y-%m-%d")
Für ISO-Zeitstempel kannst du datetime.fromisoformat("2024-12-25T10:30:00") verwenden.
2. Was macht strptime()?
strptime() steht für „string parse time“. Die erwartete Struktur wird über Format-Direktiven wie %Y, %m, %d und weitere Codes festgelegt. Die Variante des datetime-Moduls liefert ein datetime-Objekt zurück, während die Funktion aus dem time-Modul ein struct_time-Objekt erzeugt. Keine der beiden Funktionen erkennt das Format automatisch.
3. Was ist strftime() in Python?
strftime() formatiert ein datetime-Objekt als String. Die Format-Codes entsprechen denen von strptime(), allerdings läuft die Konvertierung in die entgegengesetzte Richtung. Beispielsweise gibt dt.strftime("%Y-%m-%d") den Wert 2024-06-15 aus.
4. Wie verwendet man strptime() und strftime() zusammen?
Zuerst wird der Ausgangswert geparst. Anschließend kann das Objekt bei Bedarf verändert und danach wieder formatiert werden:
from datetime import datetime
raw = "12/25/2024"
dt = datetime.strptime(raw, "%m/%d/%Y")
iso = dt.strftime("%Y-%m-%d")
print(iso) # 2024-12-25
5. Wie lässt sich ein String in Python in einen Timestamp umwandeln?
Parse zuerst den String und rufe anschließend .timestamp() auf, um Unix-Sekunden zu erhalten:
from datetime import datetime
dt = datetime.strptime("2024-06-15 10:30:00", "%Y-%m-%d %H:%M:%S")
print(int(dt.timestamp()))
Datetime-Objekte mit Zeitzoneninformationen verwenden UTC-Regeln. Bei struct_time kannst du das von time.strptime() erzeugte Tupel an time.mktime() übergeben. Dabei gelten die Regeln der lokalen Systemzeit.
6. Wie erhält man ein date anstelle eines datetime?
Parse zunächst den String und rufe anschließend .date() auf:
from datetime import datetime
d = datetime.strptime("12 25 2024", "%m %d %Y").date()
print(d) # 2024-12-25
7. Ist dateutil.parser.parse() langsamer als strptime()?
Ja, insbesondere bei großen Dateien mit einem einheitlichen Format. dateutil untersucht jeden einzelnen String. CSV-Dateien und Log-Spalten mit einem festen Aufbau lassen sich daher meist effizienter mit strptime() oder pandas.to_datetime() verarbeiten.
Wie geht es weiter?
Für die Verarbeitung von Datums- und Zeitangaben stehen damit drei zentrale Möglichkeiten zur Verfügung: strptime() für fest definierte Formate, fromisoformat() für ISO-Felder aus APIs und dateutil.parser für unterschiedlich aufgebaute Eingaben. Ergänze vor dem Produktiveinsatz eine geeignete Zeitzonenbehandlung, verarbeite nicht vertrauenswürdige Eingaben mit try/except und verwende strftime(), wenn die Werte anschließend wieder als Strings ausgegeben werden sollen.


