Konvertierung von Datums- und Zeitangaben in und aus Strings in Python datetime (strftime, strptime)

Geschäft

Die Python-Standardbibliothek datetime kann zur Verarbeitung von Datums- und Zeitangaben (Datum, Zeit und Uhrzeit) verwendet werden. Die Methoden strftime() und strptime(), die Datums- und Zeitangaben in und aus Strings konvertieren, können verwendet werden, um Datums- und Zeitangaben in einer Vielzahl von Formaten zu manipulieren.

Es kann auch Operationen wie Subtraktion und Addition durchführen. Sie können zum Beispiel leicht das Datum vor 10 Tagen oder in 3 Wochen oder die Uhrzeit in 50 Minuten berechnen und abrufen.

Zunächst werden die folgenden Klassen von Objekten beschrieben, die im datetime-Modul verfügbar sind.

  • datetime.datetime:Datum und Uhrzeit (Datum und Uhrzeit)
  • datetime.date:Datum
  • datetime.time:Zeit
  • datetime.timedelta:Zeitunterschied und verstrichene Zeit

Die Methoden strftime() und strptime(), die date\time und string ineinander umwandeln, werden ebenfalls erklärt.

  • datetimeObjekt
    • datetime.now():Heutiges Datum, aktuelle Uhrzeit
    • datetimeObjekt-Konstrukteur
    • Umwandlung eines datetime-Objekts in ein Datumsobjekt
  • dateObjekt
    • date.today():Heutiges Datum
    • Konstruktor für das Datumsobjekt
  • timeObjekt
    • Konstruktor für das Zeitobjekt
  • timedeltaObjekt
    • Subtrahieren Sie datetime- und date-Objekte, um timedelta-Objekte zu erstellen.
    • Konstruktor für das Timedelta-Objekt
    • Subtraktion und Addition mit Timedelta-Objekten
  • strftime():Umwandlung von Datum und Uhrzeit in einen String
  • strptime():Umwandlung von String in Datum und Uhrzeit

Ebenfalls in der Standardbibliothek enthalten ist das Kalendermodul, das Kalender im reinen Text- oder HTML-Format erzeugt.

Datetime-Objekt

Ein datetime-Objekt ist ein Objekt, das sowohl Datums- (Jahr, Monat, Tag) als auch Zeitinformationen (Stunde, Minute, Sekunde, Mikrosekunde) enthält. Sie können auf diese Informationen mit den folgenden Attributen zugreifen.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now(): Heutiges Datum, aktuelle Uhrzeit

datetime.now() liefert Ihnen ein datetime-Objekt mit dem heutigen Datum (dem aktuellen Datum) und der aktuellen Uhrzeit.

import datetime

dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231

print(type(dt_now))
# <class 'datetime.datetime'>

print(dt_now.year)
# 2018

print(dt_now.hour)
# 18

Konstruktor für datetime-Objekt

Es ist auch möglich, datetime-Objekte für beliebige Daten und Zeiten zu erzeugen.

Der Konstruktor für das datetime-Objekt lautet wie folgt.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Die folgenden Werte sind erforderlich, andere können weggelassen werden. Wenn sie weggelassen werden, ist der Standardwert 0.

  • year
  • month
  • day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000

print(dt.minute)
# 15

print(dt.microsecond)
# 2000

dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00

print(dt.minute)
# 0

Umwandlung eines datetime-Objekts in ein Datumsobjekt

Ein datetime-Objekt kann mit der Methode date() in ein Datumsobjekt umgewandelt werden, wie im Folgenden beschrieben.

print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>

print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>

Datumsobjekt

Ein Datumsobjekt ist ein Objekt, das Informationen über ein Datum (Jahr, Monat, Tag) enthält. Auf es kann über die Attribute Jahr, Monat und Tag zugegriffen werden.

date.today(): Heutiges Datum

Das Datumsobjekt des aktuellen Datums (heutiges Datum) kann mit date.today() ermittelt werden.

d_today = datetime.date.today()
print(d_today)
# 2018-02-02

print(type(d_today))
# <class 'datetime.date'>

print(d_today.year)
# 2018

Konstruktor für das Datumsobjekt

Der Konstruktor für das Datumsobjekt lautet wie folgt

date(year, month, day)

Alle sind erforderlich und können nicht weggelassen werden.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

Zeitobjekt

Das Zeitobjekt ist ein Objekt, das Informationen über die Zeit (Stunden, Minuten, Sekunden und Mikrosekunden) enthält. Es kann über die Attribute Stunde, Minute, Sekunde und Mikrosekunde aufgerufen werden.

Konstruktor für das Zeitobjekt

Der Konstruktor des Zeitobjekts sieht folgendermaßen aus.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Sie sind alle optional und werden, wenn sie weggelassen werden, auf 0 gesetzt.

t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000

print(type(t))
# <class 'datetime.time'>

print(t.hour)
# 12

t = datetime.time()
print(t)
# 00:00:00

Timedelta-Objekt

Das timedelta-Objekt ist ein Objekt, das die Zeitdifferenz zwischen zwei Daten und Zeiten oder die verstrichene Zeit darstellt. Es enthält Informationen in Tagen, Sekunden und Mikrosekunden und kann über die Attribute days, seconds und microseconds aufgerufen werden. Es ist auch möglich, die Gesamtzahl der Sekunden mit der Methode total_seconds() zu ermitteln.

Subtrahieren Sie datetime- und date-Objekte, um ein timedelta-Objekt zu erstellen.

Subtrahiert man datetime-Objekte voneinander, erhält man ein timedelta-Objekt.

td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231

print(type(td))
# <class 'datetime.timedelta'>

print(td.days)
# 1

print(td.seconds)
# 66673

print(td.microseconds)
# 271231

print(td.total_seconds())
# 153073.271231

Die Subtraktion von Datumsobjekten voneinander ergibt in ähnlicher Weise ein Timedelta-Objekt.

Konstruktor für das Timedelta-Objekt

Der Konstruktor des timedelta-Objekts lautet wie folgt

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Sie sind alle optional und werden, wenn sie weggelassen werden, auf 0 gesetzt.

Beachten Sie, dass das timedelta-Objekt nur die folgenden Informationen enthält.

  • eine Reihe von Tagen: days
  • Anzahl der Sekunden: seconds
  • Mikrosekundenzählung: microseconds

Zum Beispiel sind die beiden folgenden gleich

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

Subtraktion und Addition mit Timedelta-Objekten

Das timedelta-Objekt kann zusammen mit den Objekten datetime und date verwendet werden, um Operationen wie Subtraktion und Addition durchzuführen. So können Sie z. B. leicht das Datum vor einer Woche oder in 10 Tagen oder die Uhrzeit in 50 Minuten berechnen und abrufen.

d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26

td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00

dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231

td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00

print(td_50m.seconds)
# 3000

dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231

Sie kann auch dazu verwendet werden, die Anzahl der Tage bis zu einem bestimmten Datum zu berechnen.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime(): Umwandlung von Datum und Uhrzeit in einen String

Die Methode strftime() von datetime- und date-Objekten kann verwendet werden, um Datums- und Zeitangaben in eine Zeichenkette in einem beliebigen Format zu konvertieren.

Formatierungscode

Die verfügbaren Formatierungscodes finden Sie in der offiziellen Dokumentation weiter unten.

Die wichtigsten Formatierungscodes sind nachstehend aufgeführt.

  • %d:Tag des Monats in Dezimalschreibweise mit aufgefüllter Null.
  • %m:Monat in Dezimalschreibweise mit aufgefüllter Null.
  • %y:Die letzten beiden Ziffern der Jahreszahl in Dezimaldarstellung mit Nullen.
  • %Y:Vier Ziffern der Jahreszahl in Dezimalschreibweise mit aufgefüllter Null.
  • %H:Ausgedrückt in Dezimalschreibweise mit aufgefüllter Null (24-Stunden-Schreibweise)
  • %I:In Dezimalschreibweise mit aufgefüllten Nullen (12-Stunden-Schreibweise)
  • %M:Für die Dezimalschreibweise mit aufgefüllter Null.
  • %S:Sekunden in Dezimalschreibweise mit aufgefüllter Null.
  • %f:Mikrosekunden (6 Ziffern) in Dezimalschreibweise mit 0 aufgefüllt.
  • %A:Name des Wochentags für das Gebietsschema
  • %a:Name des Tages für den Ort (abgekürzte Form)
  • %B:Lokaler Monatsname
  • %b:Lokaler Monatsname (abgekürzte Form)
  • %j:Tag des Jahres in Dezimalschreibweise mit Nullfüllung.
  • %U:Wochennummer des Jahres in Dezimalschreibweise mit Nullfüllung (die Woche beginnt am Sonntag)
  • %W:Wochennummer des Jahres in Dezimalschreibweise mit Nullfüllung (die Woche beginnt am Montag)

Die folgenden Formatierungscodes für Tages- und Monatsnamen können je nach Gebietsschema in verschiedenen Zeichenfolgen erhalten werden.

  • %A
  • %a
  • %B
  • %b

Es gibt auch eine spezielle Methode für Zeichenketten im ISO 8601-Format.

Beispiel-Code

print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13

print(d_today.strftime('%y%m%d'))
# 180202

print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018

print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05

Wenn Sie statt einer Zeichenkette eine Zahl erhalten möchten, wandeln Sie sie einfach mit int() in eine Ganzzahl um.

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

In Kombination mit dem timedelta-Objekt ist es einfach, z. B. eine Liste von zweiwöchentlichen Terminen in einem beliebigen Format zu erstellen.

d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'

l = []

for i in range(n):
    l.append((d + i * td).strftime(f))

print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10

Die Verwendung der Notation für das Listenverständnis ist klüger.

l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

strptime(): Umwandlung von String in Datum und Uhrzeit

datetime strptime() kann verwendet werden, um ein datetime-Objekt aus einer Datums- oder Zeitzeichenfolge zu erstellen. Es ist notwendig, die Formatierungszeichenfolge anzugeben, die der ursprünglichen Zeichenfolge entspricht.

Es gibt auch eine spezielle Methode für ISO 8601-Strings (Python 3.7 oder höher).

Beispiel-Code

date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00

print(type(date_dt))
# <class 'datetime.datetime'>

Mit der Methode strftime() können Sie das Datum und die Uhrzeit in einem anderen Format als der ursprünglichen Zeichenkette darstellen.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

Wenn Sie es in ein datetime-Objekt umwandeln, können Sie auch Operationen mit timedelta-Objekten durchführen, so dass Sie z. B. eine Zeichenkette für ein Datum vor 10 Tagen im gleichen Format erzeugen können.

date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)

date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)

print(date_str_new)
# 2018-01-22