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 timedeltatylko dzień mnogiej (na przykład hours, days) w celu określenia względnej różnicy czasu, relativedeltainne liczby pojedynczej rzeczowników oraz (na przykład hour, day) dla oznaczenia absolutnej godzinie.
Wynika to jasno z definicji dwóch klas:
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)
Co dokładnie robi liczba pojedyncza? Forma pojedyncza tworzy deltę, która po dodaniu do datetimeobiektu ustawia określony prymityw daty / godziny w datetimeobiekcie na ten wymieniony w relativedelta. 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)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
Może to prowadzić do relativedeltawykorzystania w interesujących aplikacjach, których wdrożenie może być skomplikowane przy użyciu timedelta. Jeden, który szybko przychodzi na myśl, to zaokrąglanie.
Ciekawa aplikacja: szybkie zaokrąglanie
Pokażę teraz, jak relativedeltajest bardziej wyrazisty podczas zaokrąglania datetimeprzedmiotu do najbliższej minuty, godziny, dnia itp.
Zaokrąglenie do najbliższej godziny:
Zwróć uwagę, jak proste jest zaokrąglanie za pomocą relativedelta:
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
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ć, relativedeltamożna również wykonać za pomocą datetimefunkcji i timedeltatylko w nieco bardziej zawiły sposób.
dateime.timedeltaktóra osiągnie to, co chcesz i uniknie zależności oddateutilpakietu zewnętrznego .