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 wie 2024-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 einem datetime-Objekt einen String. Als Merkhilfe gilt: parse steht für strptime, während format zu strftime gehö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 mit try/except oder teste mehrere Format-Strings nacheinander in einer Schleife.
  • %z verarbeitet Zeitzonen-Offsets wie +0530. Ab Python 3.11 akzeptiert fromisoformat() auch Schreibweisen wie +05:30 mit Doppelpunkt.
  • time.strptime() gibt ein struct_time-Objekt zurück. In den meisten Anwendungen ist datetime.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 über pip:

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-DD und grundlegende Varianten mit T als 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:

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.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: