Использование datetime.timedelta для добавления лет - PullRequest
0 голосов
/ 28 января 2019

Я делаю некоторые вычисления времени в Python.

Цель:

Часть этого пытается:

Учитывая дату, добавить интервал времени (X лет, X месяцев, X недель), дата возврата

т.е.

  • входные аргументы: input_time (datetime.date), интервал (datetime.timedelta)
  • return: datetime.date

Я посмотрел на datetime и datetime.timedelta docs

класс datetime.timedelta (days = 0, секунд = 0, микросекунд = 0, миллисекунд = 0, минут = 0, часов = 0, недель = 0)).

Похоже, они хорошо работают, если я хочу добавить определенное количество часов или недель.Тем не менее,

Проблема:

  • Я пытаюсь реализовать такую ​​операцию, как дата + 1 год и не могу понять это

Например

start = datetime.datetime(2000, 1, 1)
# expected output: datetime.datetime(2001, 1, 1)


# with the weeks, etc arguments given in timedelta, this fails unsurprisingly e.g 
start + datetime.timedelta(weeks = 52)

# returns datetime.datetime(2000, 12, 30, 0, 0)

Вопрос

  • Возможна ли эта годовая операция с помощью базовых инструментов datetime - если да, то как мне это сделать??

  • Я понимаю, что для примера года я мог бы просто сделать start.replace(year = 2001), но этот подход потерпит неудачу, если в качестве входных данных у меня будут месяцы или недели.

  • Насколько я понимаю, библиотека dateutil обладает более продвинутыми функциями, но мне неясно, насколько хорошо она взаимодействует со встроенными объектами datetime.

Я рассмотрел этот вопрос , но это мне не помогло.

Любая помощь приветствуется!

Запуск Python 3.6.5 на MacO.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы можете жестко запрограммировать новый год значения даты и времени, используя вместо этого замену :) Это позволяет избежать високосных лет и т. Д.

year_later = current.replace(year=current.year + 1)
0 голосов
/ 28 января 2019

timedelta не поддерживает годы, потому что продолжительность года зависит от того, какой год (например, високосные годы имеют 29 февраля).

Вместо этого можно использовать relativedelta, который поддерживаетyears и учитывает базовую дату для дополнений:

>>> from dateutil.relativedelta import relativedelta
>>> now = datetime.now()
>>> now 
datetime.datetime(2019, 1, 27, 19, 4, 11, 628081)
>>> now + relativedelta(years=1)
datetime.datetime(2020, 1, 27, 19, 4, 11, 628081)
...