В чем разница между 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)