Konvertieren von Strings in Datetime in Python

Einleitung

Daten können in verschiedenen Formen dargestellt werden – und eine bequeme Art, Datum und Uhrzeit darzustellen, sind Streicher. Um jedoch mit diesen Datums- und Zeitangaben auf arithmetische Weise zu arbeiten (z. B. Zeitunterschiede zu berechnen, Zeit hinzuzufügen oder zu entfernen usw.), müssen wir sie in a umwandeln datetime Objekt.

Eine der häufigsten Quellen für string-formatierte datetimes sind REST-APIs, die agnostische Zeichenfolgen zurückgeben, die wir dann in andere Formate konvertieren können.

Außerdem – Zeitzonen sind ein häufiges Problem bei der Arbeit mit datetime-Objekten, also müssen wir das auch beim Konvertieren berücksichtigen.

In dieser Anleitung sehen wir uns an, wie man eine Datums-/Uhrzeit-Zeichenfolge in eine umwandelt datetime Objekt in Python unter Verwendung des eingebauten datetime Modul, aber auch Module von Drittanbietern wie z dateutil, arrow und Maya, die Zeitzonen berücksichtigen.

Konvertieren von Zeichenfolgen mit datetime

Das datetime Modul besteht aus drei verschiedenen Objekttypen: date, time und datetimedem „Vermischten Geschmack“. Seine date Objekt enthält das Datum, time hält die Zeit, und datetime enthält Datum und Uhrzeit!

import datetime
print(f'Current date/time: {datetime.datetime.now()}')

Das Ausführen dieses Codes würde zu Folgendem führen:

Current date/time: 2022-12-01 10:27:03.929149

Wenn keine benutzerdefinierte Formatierung angegeben ist, wird das standardmäßige Zeichenfolgenformat verwendet, dh das Format für „2022-12-01 10:27:03.929149“ ist in ISO 8601 Format (JJJJ-MM-TTTHH:MM:SS.mmmmmm). Wenn unsere Eingabezeichenfolge zum Erstellen einer datetime -Objekt im selben ISO 8601-Format vorliegt oder wenn Sie das Format kennen, das Sie im Voraus erhalten, können wir es problemlos in a parsen datetime Objekt:

import datetime

date_time_str = '2022-12-01 10:27:03.929149'

date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

Wenn Sie es ausführen, werden Datum, Uhrzeit und Datum-Uhrzeit gedruckt:

Date: 2022-12-01
Time: 10:27:03.929149
Date-time: 2022-12-01 10:27:03.929149

Hier verwenden wir die strptime() Methode, die zwei Argumente akzeptiert:

  • Das als Zeichenfolge formatierte Datum
  • Das Format des ersten Arguments

Wenn Sie das Format so angeben, wird das Parsen seitdem viel schneller datetime muss nicht versuchen, das Format selbst zu interpretieren, was rechenaufwendiger ist. Der Rückgabewert ist vom Typ datetime.

In unserem Beispiel, "2022-12-01 10:27:03.929149" ist die Eingabezeichenfolge und "%Y-%m-%d %H:%M:%S.%f" ist das Format unserer Datumszeichenfolge. Die zurückgekehrten datetime Wert wird gespeichert als date_time_obj.

Da dies ein datetime Objekt können wir das nennen date() und time() Methoden direkt darauf. Wie Sie aus der Ausgabe sehen können, druckt es den 'Datum'- und 'Uhrzeit'-Teil der Eingabezeichenfolge!

Token formatieren

Es lohnt sich, sich einen Moment Zeit zu nehmen, um es zu verstehen Token formatieren - Die "%Y-%m-%d %H:%M:%S.%f" von vorhin.

Jedes Token repräsentiert einen anderen Teil der Datums-Uhrzeit, wie Tag, Monat, Jahr, Tag des Monats oder Woche usw. Die Liste der unterstützten Token ist umfangreich genug, um verschiedene Formatierungen zu ermöglichen. Einige der häufig verwendeten, die wir auch früher verwendet haben, sind:

  • %Y: Jahr (4 Ziffern)
  • %m: Monat
  • %d: Monatstag
  • %H: Stunde (24 Stunden)
  • %M: Protokoll
  • %S: Sekunden
  • %f: Mikrosekunden

Hinweis: Alle diese Token, mit Ausnahme des Jahres, werden voraussichtlich mit Nullen aufgefüllt (dh August ist der 8. Monat und wird mit Nullen aufgefüllt). 08).

Verwenden von strptime()-Format-Tokens zum Konvertieren von Strings in ein anderes Datetime-Format

Wenn das Format eines Strings bekannt ist, kann es leicht in a geparst werden datetime Objekt mit strptime(). Schauen wir uns ein nicht triviales Beispiel an, das von einem Format in ein anderes übersetzt wird:

import datetime

date_time_str = 'Jul 17 2022 9:20AM'
date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

Die Eingabezeichenfolge hatte ein Format – „17. Juli 2022 9:20 Uhr“. Da wir dieses Format kannten, bildeten wir die konstituierenden Elemente auf das ISO 8601-Format ab und konvertierten es in a datetime Objekt:

Date: 2022-07-17
Time: 09:20:00
Date-time: 2022-07-17 09:20:00

Hier ist eine kurze Liste gängiger Datums- und Uhrzeitangaben im Zeichenfolgenformat und der entsprechenden Formate für strptime():

"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p"
"September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S"
"Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p"
"Mon, 21 March, 2015" -> "%a, %d %B, %Y"
"2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"

Sie können eine Datum-Uhrzeit-Zeichenfolge in einem beliebigen Format parsen – solange Sie die richtige Zeichenfolge von Format-Tokens für die empfangene Eingabe verwenden.

Konvertieren Sie String mit Zeitzonen in Datetime

Der Umgang mit Datums- und Uhrzeitangaben wird beim Umgang mit Zeitzonen komplexer. Alle obigen Beispiele sind bisher naiv gegenüber der Zeitzone. Diese sind bekannt als naive datetime-Objekte.

Allerdings ist die datetime Objekte enthalten ein Feld genau zum Speichern von zeitzonenbezogenen Daten – tzinfo:

import datetime as dt
dtime = dt.datetime.now()

print(dtime) 
print(dtime.tzinfo) 

Das tzinfo Feld soll a sein datetime.timezone -Objekt, das die Zeitzoneninformationen angibt. Es ist None standardmäßig und gibt an, dass das datetime-Objekt zeitzonennaiv ist. Eine sehr gebräuchliche externe Bibliothek zum Umgang mit Zeitzonen ist pytz. Sie können einstellen PyTz Objekte als die tzinfo Feld auch.

Wenn Sie es noch nicht haben – installieren Sie es über:

$ pip install pytz

Mit PyTz können wir einen Anker für zeitzonenbewusste Datumsangaben wie UTC erstellen:

import datetime as dt
import pytz

dtime = dt.datetime.now(pytz.utc)

print(dtime)
print(dtime.tzinfo)

Ausgang:

2022-12-01 02:07:41.960920+00:00
UTC

Es ist nicht mehr 11 Uhr, sondern 2 Uhr morgens, weil wir die Zeitzone um ein paar Stunden zurückgestellt haben! Das ändert die Zeitzone der Datumszeit.

+00:00 ist die Differenz zwischen der angezeigten Zeit und der UTC-Zeit als globaler Koordinationsanker. Wir haben die Zeit in UTC eingestellt, also ist der Offset 00:00. Dies ist ein zeitzonenbewusstes Objekt.

Auf ähnliche Weise können wir die Interpretation der gleichen datetime zwischen den Zeitzonen umschalten. Konvertieren wir eine Zeichenfolge wie „2022-06-29 17:08:00“ in eine Datumszeit und dann lokalisieren in die Zeitzone „America/New_York“:

import datetime as dt
import pytz

date_time_str = '2022-06-29 17:08:00'
date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')

timezone = pytz.timezone('America/New_York')
timezone_date_time_obj = timezone.localize(date_time_obj)

print(timezone_date_time_obj)
print(timezone_date_time_obj.tzinfo)

Hinweis: Lokalisierung verwandelt eine zeitzonennaive datetime in eine zeitzonenbewusste datetime und behandelt die Zeitzone als die lokale. Und so kam es dass der datetime bleibt gleich, aber angesichts der unterschiedlichen Zeitzone stellt es nicht mehr denselben Zeitpunkt dar, der von Zeitzonen ungebunden ist.

Wir bekommen das gleiche datetime-Wert, versetzt um -04: 00 im Vergleich zur UTC-Zeit:

2022-06-29 17:08:00-04:00
America/New_York

17:08 in Tokio ist nicht derselbe Zeitpunkt wie 17:08 in New York. 17:08 in Tokio ist 3:08 in New York.

Wie finde ich alle Zeitzonencodes/Aliase?

Um alle verfügbaren Zeitzonen zu finden, überprüfen Sie die all_timezones Feld, das eine Liste aller verfügbaren Zeitzonen ist:

print(f'There are {len(pytz.all_timezones)} timezones in PyTzn')
for time_zone in pytz.all_timezones:
   print(time_zone)

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

There are 594 timezones in PyTz

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
...

Ändern Sie die Zeitzone von Datetime

Wir können die Zeitzone einer zeitzonenbewussten konvertieren datetime Objekt von einer Region in eine andere, anstatt eine zeitzonennaive Datumszeit durch die Linse einer Zeitzone zu lokalisieren.

Dies unterscheidet sich von der Lokalisierung, da die Lokalisierung einen anderen Zeitpunkt darstellt, die Konvertierung der Zeitzone eines Objekts jedoch denselben Zeitpunkt durch eine andere Linse darstellt:

import datetime as dt
import pytz

timezone_nw = pytz.timezone('America/New_York')
nw_datetime_obj = dt.datetime.now(timezone_nw)

timezone_london = pytz.timezone('Europe/London')
london_datetime_obj = nw_datetime_obj.astimezone(timezone_london)


print('America/New_York:', nw_datetime_obj)
print('Europe/London:', london_datetime_obj)

Zuerst haben wir ein datetime-Objekt mit der aktuellen Uhrzeit erstellt und es als Zeitzone „America/New_York“ festgelegt. Dann mit der astimezone() Methode haben wir dies konvertiert datetime in die Zeitzone „Europe/London“. Beide datetimes gibt verschiedene Werte aus, wobei der UTC-Offset als Referenzverbindung zwischen ihnen verwendet wird:

America/New_York: 2022-11-30 21:24:30.123400-05:00
Europe/London: 2022-12-01 02:24:30.123400+00:00

2:24 am nächsten Tag in London is zum gleichen Zeitpunkt wie 21:24 Uhr am Vortag in New York da London zeitlich 5Std. voraus ist.

Wie erwartet sind die Datums- und Uhrzeitangaben unterschiedlich, da sie etwa 5 Stunden auseinander liegen.

Konvertieren Sie String mithilfe von Bibliotheken von Drittanbietern in Datetime

Pythons datetime Modul kann alle Arten von Strings in a umwandeln datetime Objekt. Das Hauptproblem besteht jedoch darin, dass Sie dazu die entsprechende Formatierungscodezeichenfolge erstellen müssen strptime() kann verstehen. Das Erstellen dieser Zeichenfolge nimmt Zeit in Anspruch und erschwert das Lesen des Codes.

Stattdessen können wir andere Bibliotheken von Drittanbietern verwenden, um es einfacher zu machen.

In einigen Fällen haben diese Bibliotheken von Drittanbietern auch eine bessere integrierte Unterstützung zum Bearbeiten und Vergleichen von Datums- und Uhrzeitangaben, und einige haben sogar integrierte Zeitzonen, sodass Sie kein zusätzliches PyTz-Paket hinzufügen müssen.

Sehen wir uns in den folgenden Abschnitten einige dieser Bibliotheken an.

Konvertieren Sie String mit dateutil in Datetime

Das dateutil-Modul ist eine Erweiterung der datetime Modul. Ein Vorteil ist, dass wir keinen Parsing-Code übergeben müssen, um einen String zu parsen!

Automatisches Konvertieren einer Zeichenfolge in datetime ohne Formattoken mithilfe von Python dateutil:

from dateutil.parser import parse
datetime = parse('2018-06-29 22:21:41')

print(datetime)

Dieser parse Funktion wird die Zeichenfolge automatisch analysieren! Sie müssen keine Formatzeichenfolge einschließen. Lassen Sie uns versuchen, verschiedene Arten von Zeichenfolgen mit zu analysieren dateutil:

from dateutil.parser import parse

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = parse(date)
    print(dt.date())
    print(dt.time())
    print(dt.tzinfo)
    print('n')

Ausgang:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29
08:15:27.243860
None

Parsing: Jun 28 2018 7:40AM
2018-06-28
07:40:00
None

Parsing: Jun 28 2018 at 7:40AM
2018-06-28
07:40:00
None

Parsing: September 18, 2017, 22:19:55
2017-09-18
22:19:55
None

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12
12:30:00
None

Parsing: Mon, 21 March, 2015
2015-03-21
00:00:00
None

Parsing: 2018-03-12T10:12:45Z
2018-03-12
10:12:45
tzutc()

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29
17:08:00.586525
tzutc()

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29
17:08:00.586525
tzoffset(None, 18000)

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06
16:30:00
None

Sie können sehen, dass fast jede Art von Zeichenfolge einfach mit analysiert werden kann dateutil Modul.

Dies ist zwar praktisch, aber erinnern Sie sich an frühere Ausführungen, dass die Vorhersage des Formats den Code viel langsamer macht. Wenn Ihr Code also eine hohe Leistung erfordert, ist dies möglicherweise nicht der richtige Ansatz für Ihre Anwendung.

Konvertieren Sie String mit Maya in Datetime

Maya macht es auch sehr einfach, eine Zeichenfolge zu analysieren und Zeitzonen zu ändern. So konvertieren Sie eine Zeichenfolge einfach mit Pythons Maya:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime()
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Ausgang:

2018-04-29
17:45:25
UTC

Um die Uhrzeit in eine andere Zeitzone umzurechnen:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False)
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Ausgang:

2018-04-29
13:45:25
America/New_York

Ist das nicht einfach zu bedienen? Probieren wir es aus maya mit dem gleichen Saitensatz, den wir verwendet haben dateutil:

import maya

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = maya.parse(date).datetime()
    print(dt)
    
    
    
    

Ausgang:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29 08:15:27.243860+00:00

Parsing: Jun 28 2018 7:40AM
2018-06-28 07:40:00+00:00

Parsing: Jun 28 2018 at 7:40AM
2018-06-28 07:40:00+00:00

Parsing: September 18, 2017, 22:19:55
2017-09-18 22:19:55+00:00

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12 12:30:00+00:00

Parsing: Mon, 21 March, 2015
2015-03-21 00:00:00+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12 10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29 17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29 12:08:00.586525+00:00

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06 16:30:00+00:00

Wie Sie sehen können, wurden alle Datumsformate erfolgreich geparst!

Wenn wir die Zeitzoneninformationen dann nicht bereitstellen, werden sie automatisch in UTC konvertiert. Es ist also wichtig zu beachten, dass wir sollen bieten die to_timezone und naive Parameter, wenn die Zeit nicht in UTC angegeben ist.

Konvertieren Sie String mit Arrow in Datetime

Pfeil ist eine weitere Bibliothek für den Umgang mit datetime in Python. Und wie früher mit maya, erkennt es auch das datetime-Format automatisch. Einmal interpretiert, gibt es ein Python zurück datetime Objekt aus dem arrow Objekt.

Um eine Zeichenfolge mit Python einfach in datetime zu konvertieren arrow:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z')
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Ausgang:

2018-04-29
17:45:25
tzutc()

Und so können Sie es verwenden arrow um Zeitzonen mit dem zu konvertieren to() Verfahren:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York')
print(dt)
print(dt.date())
print(dt.time())

Ausgang:

2018-04-29T13:45:25-04:00
2018-04-29
13:45:25

Wie Sie sehen können, wird die Zeichenfolge für Datum und Uhrzeit in die Region „America/New_York“ konvertiert.

Lassen Sie uns nun wieder denselben Satz von Zeichenfolgen verwenden, den wir oben verwendet haben:

import arrow

date_array = [
    '2018-06-29 08:15:27.243860',
    
    
    
    
    
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    
]

for date in date_array:
    dt = arrow.get(date)
    print('Parsing: ' + date)
    print(dt)
    
    
    
    

Dieser Code schlägt für auskommentierte Datums-Uhrzeit-Strings fehl, was mehr als die Hälfte unserer Beispiele ausmacht. Die Ausgabe für andere Zeichenfolgen lautet:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29T08:15:27.243860+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12T10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29T17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29T17:08:00.586525+05:00

Um die auskommentierten Datum-Uhrzeit-Zeichenfolgen korrekt zu analysieren, müssen Sie die entsprechende übergeben Token formatieren um der Bibliothek Hinweise zu geben, wie sie analysiert werden kann.

Zusammenfassung

In diesem Artikel haben wir verschiedene Möglichkeiten gezeigt, einen String in a zu parsen datetime Objekt in Python. Sie können sich entweder für das Standard-Python entscheiden datetime Bibliothek oder eine der in diesem Artikel erwähnten Bibliotheken von Drittanbietern, neben vielen anderen.

Das Hauptproblem mit dem Standard datetime Paket ist, dass wir den Parsing-Code für fast alle Datum-Uhrzeit-String-Formate manuell angeben müssen. Wenn sich also Ihr Zeichenfolgenformat in Zukunft ändert, müssen Sie wahrscheinlich auch Ihren Code ändern. Aber viele Bibliotheken von Drittanbietern, wie die hier erwähnten, handhaben es automatisch.

Ein weiteres Problem, dem wir gegenüberstehen, ist der Umgang mit Zeitzonen. Der beste Weg, damit umzugehen, besteht immer darin, die Zeit in Ihrer Datenbank im UTC-Format zu speichern und sie dann bei Bedarf in die lokale Zeitzone des Benutzers zu konvertieren.

Diese Bibliotheken eignen sich nicht nur zum Analysieren von Zeichenfolgen, sondern können auch für viele verschiedene Arten von datums- und zeitbezogenen Operationen verwendet werden. Ich würde Sie ermutigen, die Dokumente durchzugehen, um die Funktionalitäten im Detail zu lernen.

Zeitstempel:

Mehr von Stapelmissbrauch