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 eingebautendatetime
Modul, aber auch Module von Drittanbietern wie zdateutil
,arrow
und Maya, die Zeitzonen berücksichtigen.
Konvertieren von Zeichenfolgen mit datetime
Das datetime Modul besteht aus drei verschiedenen Objekttypen: date
, time
und datetime
dem „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 datetime
s 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.