Как добавить «3 месяца» к объекту datetime.date в python?

Расчеты даты на Python, где ты?

У меня есть приложение python, которое нужно составлять даты каждые три месяца в течение нескольких лет. Важно, чтобы даты происходили ровно 4 раза в год и чтобы даты происходили в тот же день каждый год в максимально возможной степени и чтобы даты происходили в тот же день месяца, насколько это возможно, и чтобы даты были как можно ближе к «3 месяцам» (что является движущей целью, особенно в високосный год). К сожалению, datetime.timedelta не поддерживает месяцы!

Есть ли «стандартный» способ сделать это вычисление в python ???

Путь SQL?

Если худшее приходит к худшему, я буду плутать и попросить приложение спросить PostgreSQL, у которого есть хорошая встроенная поддержка вычислений даты, для ответа следующим образом:

 # select ('2010-11-29'::date + interval '3 months')::date; date ------------ 2011-02-28 (1 row) 

3 Solutions collect form web for “Как добавить «3 месяца» к объекту datetime.date в python?”

Если вы ищете точные или «более точные» даты, вам, вероятно, лучше проверить дату .

Быстрый пример:

 >>> from dateutil.relativedelta import relativedelta >>> import datetime >>> TODAY = datetime.date.today() >>> TODAY datetime.date(2012, 3, 6) 

Теперь добавьте 3 месяца в TODAY , обратите внимание, что он точно соответствует точному дню (обратите внимание, что relativedelta(months=3) и relativedelta(month=3) имеют разные типы поведения. Обязательно используйте months для этих примеров!).

 >>> three_mon_rel = relativedelta(months=3) >>> TODAY + three_mon_rel datetime.date(2012, 6, 6) 

И он остается неизменным в течение года. Буквально каждые три месяца, в тот день (приходилось добавлять, потому что почему-то умножая relativedelta и добавляя его к объекту datetime.date выбрасываете TypeError ):

 >>> TODAY + three_mon_rel + three_mon_rel datetime.date(2012, 9, 6) >>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel datetime.date(2012, 12, 6) >>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel + three_mon_rel datetime.date(2013, 3, 6) 

В то время как предлагаемое решение mVChr , хотя и «достаточно хорошо», со временем слегка смещается:

 >>> three_mon_timedelta = datetime.timedelta(days=3 * 365/12) >>> TODAY + three_mon_timedelta datetime.date(2012, 6, 5) 

И в течение года день месяца продолжает скользить:

 >>> TODAY + three_mon_timedelta * 2 datetime.date(2012, 9, 4) >>> TODAY + three_mon_timedelta * 3 datetime.date(2012, 12, 4) >>> TODAY + three_mon_timedelta * 4 datetime.date(2013, 3, 5) 
 import datetime some_date = datetime.date.today() three_months = datetime.timedelta(3*365/12) print (some_date + three_months).isoformat() # => '2012-06-01' 

Затем «нормализуйте» каждый новый год до дня исходной даты (кроме 29 февраля)

вот хорошее решение http://www.voidspace.org.uk/python/weblog/arch_d7_2012_02_25.shtml#e1235

отредактируйте ah standard way sorry …

  • Определение времени выполнения запросов в SQLite
  • Выбор отдельных значений столбцов в SQLAlchemy / Elixir
  • Импорт CSV-файла в Oracle с использованием CX_Oracle & Python 2.7
  • Использование Excel как решателя в Python или SQL
  • Оператор SQL IN с использованием pyodbc и SQL Server
  • Как я могу предотвратить SQL-инъекцию в PYTHON-DJANGO?
  • как выполнить внутреннее или внешнее соединение DataFrames с Pandas по не упрощенному критерию
  • Как сравнить строку версии («xyz») в MySQL?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.