В чем разница между 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)
dateime.timedelta
которая позволит достичь желаемого и избежать зависимости от внешнегоdateutil
пакета.Ответы:
dateutil
- это пакет расширения для стандартногоdatetime
модуля Python . Как вы говорите, он предоставляет дополнительные функции, такие как timedeltas, выраженные в единицах, превышающих день.Это полезно, если вам нужно задать вопросы, например, сколько месяцев я могу сэкономить до дня рождения моей девушки или какая последняя пятница в месяце? Это скрывает сложные вычисления, которые вызваны разной длиной месяцев или лишними днями в високосных годах.
В вашем случае вас интересует только количество дней. Так что вам лучше использовать, так
timedelta
как это позволяет избежать дополнительной зависимости отdateutil
пакета.источник
У A
relativedelta
намного больше параметров, чем у atimedelta
:с помощью которого вы можете делать такие вещи, как вычисление последней пятницы месяца:
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)
источник
Одно из основных различий, не освещенное в других ответах, - это наличие существительных в единственном и множественном числе для каждого примитива разницы во времени. Хотя
timedelta
предлагает только существительные во множественном числе (напримерhours
,days
) для обозначения относительной разницы во времени,relativedelta
предлагает также существительные в единственном числе (напримерhour
,day
) для обозначения информации об абсолютном времени.Это ясно из определения двух классов:
Итак, что именно делает форма единственного числа? Форма Singular создает дельту, которая при добавлении к
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) #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)
Это может привести к
relativedelta
использованию в некоторых интересных приложениях, которые может быть сложно реализовать с помощьюtimedelta
. На ум приходит округление.Интересное приложение: быстрое завершение
Сейчас я покажу вам, как
relativedelta
сделать округлениеdatetime
объекта до ближайшей минуты, часа, дня и т. Д. Более выразительным.Округление до ближайшего часа:
Обратите внимание, как просто округлить, используя
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)
Другие более сложные округления легко достижимы, используя
relativedelta
. Однако обратите внимание, что все округления, которые могут быть выполнены сrelativedelta
помощью, также могут быть выполнены с помощьюdatetime
функций иtimedelta
, только немного более запутанным способом.источник