HOWTO · Python

Datetime in Python subtrahieren

So subtrahierst du datetime-Objekte in Python und wandelst die resultierende Zeitspanne um.

Auf dieser Seite

Ziehe ein datetime-Objekt mit später - früher von einem anderen ab. Python gibt ein timedelta zurück, das die verstrichene Zeit zwischen den beiden Werten angibt. Diese Zeitspanne kannst du in Tagen und Sekunden auslesen oder in die Gesamtzahl der Sekunden, Minuten oder Stunden umrechnen.

Das Modul datetime zum Subtrahieren von Datums- und Uhrzeitwerten in Python verwenden

Das Modul datetime stellt Objekte für Datum und Uhrzeit bereit. Erstelle jedes Objekt mit Jahr, Monat und Tag; Stunden, Minuten, Sekunden und Mikrosekunden sind optional. Das folgende Beispiel verwendet feste Werte. Daher hängt das Ergebnis nicht davon ab, wann du den Code ausführst.

from datetime import datetime

earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier

print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5

Das Ergebnis ist ein timedelta von zweieinhalb Stunden. Die Attribute days, seconds und microseconds geben die Dauer in normalisierten Bestandteilen an. Um die gesamte verstrichene Zeit als Sekundenwert zu erhalten, rufst du total_seconds() für das timedelta auf, nicht für ein datetime. Teile diesen Wert durch 60, um Minuten zu berechnen, oder durch 3.600 für Stunden. Ist die Zeitspanne keine ganze Zahl von Minuten oder Stunden lang, bleiben bei diesen Divisionen die Bruchteile erhalten.

Das Attribut days enthält die Anzahl ganzer Tage. seconds gibt die verbleibenden Sekunden innerhalb der normalisierten Zeitspanne an. Keines der beiden Attribute steht für die Gesamtzahl der Sekunden. Bei einer Zeitspanne von mehr als einem Tag kann seconds beispielsweise kleiner als 86.400 sein. Verwende deshalb total_seconds(), wenn du die gesamte Zeitspanne als einen einzigen Sekundenwert benötigst. Sind Mikrosekunden enthalten, kann der Rückgabewert eine Gleitkommazahl sein.

Wenn du ganze Einheiten brauchst, legst du am besten ausdrücklich fest, wie gerundet werden soll. Eine Umwandlung mit int() schneidet den Nachkommaanteil in Richtung null ab; sie rundet nicht auf die nächste Einheit. Außerdem hat ein Jahr keine feste Dauer: 365 Tage als ein Jahr anzusetzen, ist nur eine Näherung, denn Schaltjahre und Monatsgrenzen wirken sich auf Kalenderberechnungen aus. Geht es um Kalenderangaben wie „ein Jahr später“, brauchst du eine ausdrücklich kalenderbasierte Auslegung statt einer Berechnung anhand der verstrichenen Sekunden.

Die Subtraktion funktioniert, wenn sich beide Werte konsistent miteinander vergleichen lassen. Naive Werte (ohne Zeitzoneninformationen) kannst du von anderen naiven Werten abziehen. Bei zeitzonenbewussten Werten wandelst du beide mit astimezone(timezone.utc) in UTC um, wenn du die verstrichene Zeit über Zeitzonenwechsel hinweg berechnen möchtest. Eine Mischung aus einem naiven und einem zeitzonenbewussten Wert löst einen TypeError aus. Weise Zeitzoneninformationen daher bewusst zu oder wandle die Werte um, bevor du sie subtrahierst.