В чем разница между "datetime.timedelta" и "dateutil.relativedelta.relativedelta" при работе только с днями?

В чем разница между datetime.timedelta (из стандартной библиотеки Python) и dateutil.relativedelta.relativedelta, когда работает только с днями?

Насколько я понимаю, timedelta поддерживает только дни (и недели), а relativedelta добавляет поддержку периодов, определяемых с точки зрения лет, месяцев, недель или дней, а также определения абсолютных значений за год, месяц или день. (помните, для целей этого вопроса мне не нужно беспокоиться о часах, минутах или секундах)

Учитывая, что я работаю только с объектами datetime.date и интересуюсь только периодами, определяемыми количеством дней, какова разница между timedelta и relativedelta? Есть ли разница?

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)

Ответ 1

dateutil - это пакет расширения для стандартного datetime модуля python. Как вы говорите, он предоставляет дополнительные функции, такие как timedeltas, которые выражаются в единицах, превышающих день.

Это полезно, если вам нужно задавать вопросы, например, сколько месяцев я могу сохранить до того, как наступит день рождения моей подруги или какая последняя пятница месяца? Это скрывает сложные вычисления, вызванные разной продолжительностью месяцев или дополнительными днями в високосные годы.

В вашем случае вас интересует только количество дней. Поэтому лучше всего использовать timedelta, поскольку это позволяет избежать дополнительной зависимости от пакета dateutil.

Ответ 2

A relativedelta имеет гораздо больше параметров, чем 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)

с помощью которого вы можете делать такие вещи, как вычисление последней пятницы в месяц:

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)