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