Was ist der Unterschied zwischen "datetime.timedelta" und "dateutil.relativedelta.relativedelta", wenn nur mit Tagen gearbeitet wird?

87

Was ist der Unterschied zwischen datetime.timedelta(aus Pythons Standardbibliothek) und der dateutil.relativedelta.relativedeltaArbeit nur mit Tagen?

Soweit ich weiß, werden timedeltanur Tage (und Wochen) unterstützt, während relativedeltaUnterstützung für Zeiträume hinzugefügt wird, die in Jahren, Monaten, Wochen oder Tagen definiert sind, sowie Absolutwerte für Jahr, Monat oder Tag definiert werden. (Denken Sie daran, dass ich mir für die Zwecke dieser Frage keine Gedanken über Stunden, Minuten oder Sekunden machen muss.)

Wenn man bedenkt, dass ich nur mit datetime.dateObjekten arbeite und mich nur für Zeiträume interessiere, die durch die Anzahl der Tage definiert sind, was ist der Unterschied zwischen timedeltaund relativedelta? Gibt es einen Unterschied?

from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

i = -1  # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)
Denilson Sá Maia
quelle
3
Wenn Sie nur an Tagen zwischen Daten an Deltas interessiert sind, verwenden Sie einfach die Standardbibliotheken, mit dateime.timedeltadenen Sie das erreichen, was Sie möchten, und vermeiden Sie die Abhängigkeit vom externen dateutilPaket.
Pedro Romano
Es ist erwähnenswert, dass die Berechnung von Deltas in Tagen zwischen Daten neben der Speicherung einer zusätzlichen Abhängigkeit mit timedelta um ein Vielfaches schneller ist als mit relativedelta. (~ 10 mal)
Julien B.

Antworten:

76

dateutilist ein Erweiterungspaket für das Python-Standardmodul datetime. Wie Sie sagen, bietet es zusätzliche Funktionen, z. B. Zeitpläne, die in Einheiten ausgedrückt werden, die größer als ein Tag sind.

Dies ist nützlich, wenn Sie Fragen stellen müssen, z. B. wie viele Monate kann ich sparen, bevor der Geburtstag meiner Freundin kommt, oder was ist der letzte Freitag im Monat? Dies verbirgt komplexe Berechnungen, die durch die unterschiedlichen Längen der Monate oder zusätzliche Tage in Schaltjahren verursacht werden.

In Ihrem Fall interessiert Sie nur die Anzahl der Tage. Verwenden Sie diese Option am besten, timedeltada dadurch eine zusätzliche Abhängigkeit vom dateutilPaket vermieden wird .

Hans Dann
quelle
31

A relativedeltahat viel mehr Parameter als a timedelta:

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

mit denen Sie beispielsweise den letzten Freitag eines Monats berechnen können:

In [14]: import datetime as dt

In [15]: import dateutil.relativedelta as relativedelta

In [16]: today = dt.date.today()

In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1))

In [18]: today+rd
Out[18]: datetime.date(2012, 9, 28)
unutbu
quelle
1
Dies ist eine fantastische Antwort, die neue Erkenntnisse über die Verwendung eines relativedelta für Dinge wie "letzter Freitag des Monats" gab :) Danke!
PascalVKooten
8

Ein Hauptunterschied, der in anderen Antworten nicht hervorgehoben wird, ist das Vorhandensein von Singular- und Pluralnomen für jedes Zeitdifferenzprimitiv. Während timedeltanur über Angebote Substantive Plural (zB hours, days) relative Zeitdifferenz bezeichnen relativedeltaAngebote Singular als auch (zB hour,day ) absolute Zeitinformation zu bezeichnen.

Dies geht aus der Definition der beiden Klassen hervor:

Definition:   datetime.timedelta([days[, seconds[, microseconds[, 
milliseconds[, minutes[, hours[, weeks]]]]]]])

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

Was genau macht die Singularform? Die Singularform erzeugt ein Delta, das beim Hinzufügen zu einem datetimeObjekt das bestimmte Datums- / Uhrzeitprimitiv im datetimeObjekt auf das in der relativedelta. Hier ist ein kleines Beispiel:

>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1) #Simply add one hour
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am
datetime.datetime(2018, 11, 17, 1, 6, 31)

Dies kann dazu führen, relativedeltadass einige interessante Anwendungen verwendet werden, deren Implementierung kompliziert sein kanntimedelta . Eine, die schnell in den Sinn kommt, ist die Abrundung.

Eine interessante Anwendung: Schnell abrunden

Ich werde Ihnen jetzt zeigen, wie relativedeltaaussagekräftiger es ist, ein datetimeObjekt auf die nächste Minute, Stunde, Tag usw. abzurunden .

Auf die nächste Stunde abrunden:

Beachten Sie, wie einfach es ist, abzurunden mit relativedelta:

#Using `relativedelta`
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)

#Using `timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)

Andere kompliziertere Abrundungen sind mit leicht zu erreichen relativedelta. Beachten Sie jedoch, dass alle Abrundungen, die von durchgeführt werden relativedeltakönnen, auch mit datetimeFunktionen und timedeltanur etwas komplizierter durchgeführt werden können.

Shivams
quelle