Однією з основних різниць, не виділених в інших відповідях, є наявність іменників однини та множини для кожного примітиву різниці в часі. Хоча timedeltaпропонує лише іменники множини (наприклад hours, days) для позначення відносної різниці в часі, relativedeltaпропонує також іменники однини (наприклад hour, day) для позначення абсолютної інформації про час.
Це ясно з визначення 2 класів:
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)
Тепер, що саме робить форма однини? Сингулярна форма створює дельту, яка при додаванні до datetimeоб'єкта встановлює конкретний примітив дати / часу в datetimeоб'єкті на згаданий у relativedelta. Ось невеликий приклад:
>>> 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)
Це може призвести до relativedeltaвикористання для деяких цікавих додатків, які можуть бути складними для реалізації з використанням timedelta. Та, яка швидко спадає на думку, - це округлення.
Цікаве застосування: Швидке округлення
Зараз я покажу вам, наскільки relativedeltaвиразнішим є округлення datetimeоб’єкта з точністю до хвилини, години, доби тощо.
Округлення з точністю до години:
Зверніть увагу, наскільки просто округляти, використовуючи 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)
Інші більш складні округлення легко досягти за допомогою relativedelta. Однак зауважте, що всі заокруглення, які можна здійснити, relativedeltaтакож можна здійснити за допомогою datetimeфункцій і timedelta, лише дещо більш заплутаним способом.
dateime.timedeltaякі дозволять досягти бажаного і уникнути залежності від зовнішньогоdateutilпакета.