Jaka jest różnica między datetime.timedelta
(ze standardowej biblioteki Pythona) a dateutil.relativedelta.relativedelta
pracą tylko z dniami?
O ile rozumiem, timedelta
obsługuje tylko dni (i tygodnie), a jednocześnie relativedelta
dodaje obsługę okresów określonych w latach, miesiącach, tygodniach lub dniach, a także definiuje wartości bezwzględne dla roku, miesiąca lub dnia. (pamiętaj, na potrzeby tego pytania nie muszę się martwić o godziny, minuty czy sekundy)
Biorąc pod uwagę, że pracuję tylko z datetime.date
obiektami i interesują mnie tylko okresy zdefiniowane przez liczbę dni, jaka jest różnica między timedelta
i relativedelta
? Czy jest jakaś różnica?
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)
dateime.timedelta
która osiągnie to, co chcesz i uniknie zależności oddateutil
pakietu zewnętrznego .Odpowiedzi:
dateutil
jest pakietem rozszerzającym do standardowegodatetime
modułu Pythona . Jak mówisz, zapewnia dodatkową funkcjonalność, taką jak timedeltas wyrażane w jednostkach większych niż jeden dzień.Jest to przydatne, jeśli musisz zadawać pytania, takie jak ile miesięcy mogę zaoszczędzić, zanim nadejdą urodziny mojej dziewczyny lub jaki jest ostatni piątek miesiąca? Ukrywa to złożone obliczenia, które są spowodowane różną długością miesięcy lub dodatkowymi dniami w latach przestępnych.
W Twoim przypadku interesuje Cię tylko liczba dni. Więc najlepiej użyj,
timedelta
ponieważ pozwala to uniknąć dodatkowej zależności oddateutil
pakietu.źródło
A
relativedelta
ma o wiele więcej parametrów niżtimedelta
:za pomocą którego możesz obliczyć ostatni piątek miesiąca:
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)
źródło
Jedną z głównych różnic, które nie zostały podkreślone w innych odpowiedziach, jest obecność rzeczowników w liczbie pojedynczej i mnogiej dla każdego prymitywu różnicy czasowej. Podczas gdy
timedelta
tylko dzień mnogiej (na przykładhours
,days
) w celu określenia względnej różnicy czasu,relativedelta
inne liczby pojedynczej rzeczowników oraz (na przykładhour
,day
) dla oznaczenia absolutnej godzinie.Wynika to jasno z definicji dwóch klas:
Co dokładnie robi liczba pojedyncza? Forma pojedyncza tworzy deltę, która po dodaniu do
datetime
obiektu ustawia określony prymityw daty / godziny wdatetime
obiekcie na ten wymieniony wrelativedelta
. Oto mały przykład:>>> 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)
Może to prowadzić do
relativedelta
wykorzystania w interesujących aplikacjach, których wdrożenie może być skomplikowane przy użyciutimedelta
. Jeden, który szybko przychodzi na myśl, to zaokrąglanie.Ciekawa aplikacja: szybkie zaokrąglanie
Pokażę teraz, jak
relativedelta
jest bardziej wyrazisty podczas zaokrąglaniadatetime
przedmiotu do najbliższej minuty, godziny, dnia itp.Zaokrąglenie do najbliższej godziny:
Zwróć uwagę, jak proste jest zaokrąglanie za pomocą
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)
Inne, bardziej skomplikowane zaokrąglenia są łatwo osiągalne przy użyciu
relativedelta
. Należy jednak pamiętać, że wszystkie zaokrąglenia, które można wykonać,relativedelta
można również wykonać za pomocądatetime
funkcji itimedelta
tylko w nieco bardziej zawiły sposób.źródło