Das datetime-Modul – Teil 2

timedelta-Objekte

timedelta-Objekte stellen die Differenz zwischen zwei Datums- und Zeitangaben dar, die zum Rechnen mit date-, time- und datetime-Objekten verwendet werden können.

timedelta-Objekte speichern Informationen über Tage, Sekunden und Mikrosekunden, auf die mit den Attributen days, seconds und microseconds zugegriffen werden kann. Man kann auch die Gesamtzahl der Sekunden (einschließlich Mikrosekunden) mit der Methode total_seconds() als Fließkommazahl (float) ermitteln.

timedelta-Objekte erzeugen durch Subtraktion von datetime- oder date-Objekten

Die Subtraktion eines datetime-Objektes von einem anderen erzeugt ein timedelta-Objekt.

dt1 = datetime.datetime(2023, 4, 1, 20, 15, 30, 2000)
dt2 = datetime.datetime(2023, 7, 1, 10, 45, 15, 100)

td = dt2 - dt1
print(td)
# 90 days, 14:29:44.998100

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

print(td.days)
# 90

print(td.seconds)
# 52184

print(td.microseconds)
# 998100

print(td.total_seconds())
# 7828184.9981

Die Subtraktion eines date-Objektes von einem anderen erzeugt ebenfalls ein timedelta-Objekt.

Konstruktor des timedelta-Objektes

Der Konstruktor des timedelta-Objekts ist folgender:

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

Alle Argumente sind optional und können weggelassen werden. Wenn sie nicht angegeben werden, sind sie standardmäßig mit 0 vorbelegt.

Es ist zu beachten, dass das timedelta-Objekt nur Informationen über die Anzahl der Tage, Sekunden und Mikrosekunden speichert; zum Beispiel ist weeks=1 gleich days=7.

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

print(td_1w.days)
# 7

Rechnen mit timedelta-Objekten

Man kann arithmetische Operationen mit timedelta-Objekten, date- und datetime-Objekten durchführen. Die Addition oder Subtraktion eines timedelta-Objekts zu/von einem date- oder datetime-Objekt ergibt ein neues date- bzw. datetime-Objekt.

So kann man beispielsweise das Datum in einer Woche oder von 10 Tagen in der Zukunft oder die Uhrzeit in 50 Minuten von jetzt an berechnen.

dt = datetime.datetime(2023, 4, 1, 20, 15, 30, 2000)
print(dt)
# 2023-04-01 20:15:30.002000

print(dt - datetime.timedelta(weeks=1))
# 2023-03-25 20:15:30.002000

print(dt + datetime.timedelta(days=10))
# 2023-04-11 20:15:30.002000

print(dt + datetime.timedelta(minutes=50))
# 2023-04-01 21:10:30.002000

Ein timedelta-Objekt kann auch dazu verwendet werden, die Anzahl der Tage bis zu einem bestimmten Datum zu berechnen.

d_target = datetime.date(2023, 5, 1)
td = d_target - dt.date()
print(td)
# 30 days, 0:00:00

print(td.days)
# 30

strftime(): Datum und Zeit zu Strings konvertieren

Die strftime()-Methode konvertiert datetime-, date- und time-Objekte in Strings jedes gewünschten Formats.

Formatierungscodes

Die wichtigsten Formatcodes sind:

%d: Tag des Monats als mit Nullen aufgefüllte Dezimalzahl
%m: Monat als mit Nullen aufgefüllte Dezimalzahl
%y: Jahr ohne Jahrhundert als mit Nullen aufgefüllte Dezimalzahl
%Y: Jahr mit Jahrhundert als Dezimalzahl
%H: Stunde (24-Stunden-Uhr) als mit Nullen aufgefüllte Dezimalzahl
%I: Stunde (12-Stunden-Uhr) als mit Nullen aufgefüllte Dezimalzahl
%M: Minute als mit Nullen aufgefüllte Dezimalzahl
%S: Sekunde als mit Nullen aufgefüllte Dezimalzahl
%f: Mikrosekunde als Dezimalzahl, durch Nullen auf 6 Stellen aufgefüllt
%A: Wochentag als vollständiger Name des Gebietsschemas (Locale)
%a: Wochentag als abgekürzter Name des Gebietsschemas (Locale)
%B: Monat als vollständiger Name des Gebietsschemas (Locale)
%b: Monat als abgekürzter Name des Gebietsschemas (Locale)
%j: Tag des Jahres als mit Nullen aufgefüllte Dezimalzahl
%U: Wochennummer des Jahres (Sonntag als erster Tag der Woche) als mit Nullen aufgefüllte Dezimalzahl
%W: Wochennummer des Jahres (Montag als erster Tag der Woche) als mit Nullen aufgefüllte Dezimalzahl

Diese Formatcodes können auch in der Formatzeichenkette für die Funktion format() und f-strings verwendet werden.

Weitere Möglichkeiten der Formatierung findet man in der datetime-Dokumentation.

Beispiele

dt = datetime.datetime(2023, 4, 1, 20, 15, 30, 2000)
print(dt.strftime('%Y/%m/%d %H:%M:%S.%f'))
# 2023/04/01 20:15:30.002000

print(dt.strftime('%A, %B %d, %Y'))
# Saturday, April 01, 2023

Die Methode strftime() kann auch mit date- und time-Objekten verwendet werden. Wenn man zeitbezogene Formatcodes mit date-Objekten oder datumsbezogene Formatcodes mit time-Objekten verwenden, führt dies nicht zu einem Fehler. Stattdessen werden die Standardwerte (wie 0 oder 1) verwendet.

d = dt.date()
print(d.strftime('%Y/%m/%d %H:%M:%S.%f'))
# 2023/04/01 00:00:00.000000

t = dt.time()
print(t.strftime('%Y/%m/%d %H:%M:%S.%f'))
# 1900/01/01 20:15:30.002000

Mit einem timedelta-Objekt kann man zum Beispiel ganz einfach eine Liste von Terminen in zweiwöchigen Abständen im gewünschten Format erstellen.

d = datetime.date(2023, 4, 1)
td = datetime.timedelta(weeks=2)
n = 4
f = '%Y/%m/%d'

l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2023/04/01', '2023/04/15', '2023/04/29', '2023/05/13']

print('\n'.join(l))
# 2023/04/01
# 2023/04/15
# 2023/04/29
# 2023/05/13

strptime(): Strings in Datum und Zeit konvertieren

Die strptime()-Methode der Klasse datetime konvertiert Strings in datetime-Objekte gemäß dem angegebenen Format. Die Formatzeichenkette verwendet die gleichen Formatcodes wie strftime().

Beispiele

Man gibt die Zielzeichenfolge als erstes Argument und die Formatzeichenfolge als zweites Argument für strptime() an.

s = '2023/4/1 20:30'
s_format = '%Y/%m/%d %H:%M'
dt = datetime.datetime.strptime(s, s_format)
print(dt)
# 2023-04-01 20:30:00

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

Mit der strftime()-Methode kann man das resultierende datetime-Objekt in eine Zeichenkette umwandeln, die ein anderes Format hat als das Original.

print(dt.strftime('%Y%m%d_%H%M'))
# 20230401_2030

Nach der Konvertierung einer Zeichenkette in ein datetime-Objekt kann man ein timedelta-Objekt verwenden, um sie zu bearbeiten. So kann man beispielsweise eine Datumszeichenkette erstellen, die ein Datum vor 10 Tagen im gleichen Format darstellt.

s = '2023/4/1'
s_format = '%Y/%m/%d'
td_10d = datetime.timedelta(days=10)
dt = datetime.datetime.strptime(s, s_format) - td_10d
print(dt.strftime(s_format))
# 2023/03/22