Я использую модуль Python datetime. Я рассчитываю рассчитать дату 6 месяцев с текущей даты. Может ли кто-нибудь помочь мне с этим?
Причина, по которой я хочу создать дату через 6 месяцев после текущей даты, заключается в том, чтобы создать дату проверки . Если пользователь вводит данные в систему, у него будет дата проверки 6 месяцев с даты ввода данных.
6
к нему, с поддержкой1
перехода на следующий год (и циклический переход к месяцу назад ), если мы пойдем после декабря. Это именно то, чтоrelativedelta
делает и на самом деле делает каждый язык программирования с поддержкой такого рода концепций.date(2015, 3, 31) + relativedelta(months = 6)
даетdatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
дает2000-10-01T00:00:00
. Php: тdate_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
2000-10-01. Выбрать свой яд.Ответы:
Я нашел это решение, чтобы быть хорошим. (Это использует расширение python-dateutil )
Преимущество этого подхода заключается в том, что он решает проблемы с 28, 30, 31 днем и т. Д. Это становится очень полезным при обработке бизнес-правил и сценариев (например, генерация счетов и т. Д.)
источник
relativedelta
функция также принимает вmonth
качестве аргумента, который в основном заменяет / устанавливает / исправляет месяц в переданной дате, что сильно отличается от добавления большего количества месяцев. Просто предупреждение для людей, задающихся вопросом, нарушена ли функция, потому что они забыли дополнительные s в месяцах .datetime
по умолчанию. Я действительно предполагал, что смогу провести «месяцы» в timedelta.Ну, это зависит от того, что вы подразумеваете под 6 месяцами от текущей даты.
Используя естественные месяцы:
Используя определение банкира, 6 * 30:
источник
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
может глючит, так как она создает недопустимые даты , такие как(31, 8, 2015)
->(31, 2, 2016)
С Python 3.x вы можете сделать это так:
но вам нужно будет установить модуль python-dateutil :
источник
pip install ...
from dateutil.relativedelta import relativedelta
. Использованиеimport *
не является явным.Для начала расчета месяца к месяцу:
источник
Что вы подразумеваете под "6 месяцев"?
2009-02-13 + 6 месяцев == 2009-08-13? Или это 2009-02-13 + 6 * 30 дней?
Больше информации о mx.DateTime
источник
Итак, вот пример,
dateutil.relativedelta
который я нашел полезным для итерации в течение прошлого года, пропуская месяц каждый раз до текущей даты:Как и в случае с другими ответами, вы должны выяснить, что вы на самом деле подразумеваете под «через 6 месяцев». Если вы имеете в виду «сегодняшний день месяца в месяце шесть лет в будущем», то это будет делать:
источник
Это решение работает правильно для декабря, что большинство ответов на этой странице нет. Прежде чем использовать модуль (%) или целочисленное деление (//), необходимо сначала сдвинуть месяцы с основания 1 (т.е. января = 1) на основание 0 (т.е. января = 0), в противном случае ноябрь (11) плюс 1 месяц дает вам 12 , что при нахождении остатка (12% 12) дает 0.
(И не предлагайте "(месяц% 12) + 1" или октябрь + 1 = декабрь!)
Однако ... Это не составляет проблемы, как 31 января + один месяц. Итак, мы возвращаемся к ОП - что вы имеете в виду, добавляя месяц? Одним из решений является возврат обратно, пока вы не достигнете действительного дня, учитывая, что большинство людей предполагает, что последний день января плюс один месяц равен последнему дню февраля. Это будет работать и для отрицательных чисел месяцев. Доказательство:
источник
Я знаю, что это было в течение 6 месяцев, однако ответ показывает в Google для «добавления месяцев в Python», если вы добавляете один месяц:
это будет считать дни в текущем месяце и добавлять их к текущей дате, использование 365/12 может привести к тому, что 1/12 года может вызвать проблемы на короткие / длинные месяцы, если вы выполняете итерацию по дате.
источник
Нет прямого способа сделать это с датой Python.
Проверьте тип относительной дельты в python-dateutil . Позволяет указать дельту времени в месяцах.
источник
Просто используйте метод timetuple, чтобы извлечь месяцы, добавить свои месяцы и построить новый объект date. Если для этого уже существует метод, я не знаю его.
API немного неуклюж, но работает как пример. Также явно не будет работать на угловых делах, таких как 2008-01-31 + 1 месяц. :)
источник
new_month % 12
должно быть(new_month % 12) or 12
. В противном случае, если вы попробуете это в ноябре, вы получите ошибку. :)В пакете Dateutil реализована такая функциональность. Но имейте в виду, что это будет наивно , как уже указывали другие.
источник
Использование стандартных библиотек Python, т.е. без
dateutil
или других, и решение проблемы «31 февраля»:Тестирование:
источник
add_months(datetime.date(2018, 11, 30), 1)
возвратdatetime.date(2019, 12, 30)
(год должен быть 2018, а не 2019). Так что для этого лучше использовать выделенную, хорошо протестированную библиотеку! Если вам действительно нужно использовать только стандартные библиотечные модули, см. Мой ответ на аналогичный вопрос .У меня есть лучший способ решить проблему «31 февраля»:
Я думаю, что это также работает с отрицательными числами (чтобы вычесть месяцы), но я не очень проверял это.
источник
Класс QDate PyQt4 имеет функцию addmonths.
источник
Как насчет этого? Не используете другую библиотеку (
dateutil
) илиtimedelta
? основываясь на ответе vartec , я сделал это и считаю, что это работает:Я пытался использовать
timedelta
, но потому, что он считает дни365/2
или6*356/12
не всегда переводит на 6 месяцев, а точнее на 182 дня. напримерЯ полагаю, что мы обычно предполагаем, что 6 месяцев с определенного дня приземляются в тот же день месяца, но через 6 месяцев (то есть
2015-03-10
->2015-09-10
, Нет2015-09-08
)Я надеюсь, что вы найдете это полезным.
источник
day + datetime.timedelta(6*365/12)
не будет работать всегда, поскольку у некоторых лет есть 365 дней, а у других 366 дней.Это не отвечает на конкретный вопрос (используется
datetime
только), но, учитывая, что другие предложили использовать различные модули, здесь есть решение с использованиемpandas
.Который работает как положено в високосные годы
источник
Изменен AddMonths () для использования в Zope и обработки недопустимых номеров дней:
источник
источник
источник
Модифицированный ответ Йоханнеса Вея в случае 1new_month = 121. Это прекрасно работает для меня. Месяцы могут быть положительными или отрицательными.
источник
Еще одно решение - надеюсь, кому-то понравится:
Это решение не работает в течение 29, 30, 31 дней для всех случаев, поэтому требуется более надежное решение (что уже не так приятно :)):
источник
Из этого ответа смотрите parsedatetime . Пример кода приведен ниже. Более подробная информация: модульное тестирование с множеством примеров преобразования на естественном языке -> ГГГГ-ММ-ДД и очевидные проблемы / ошибки преобразования во время анализа .
Приведенный выше код генерирует следующее на компьютере MacOSX:
источник
Вот пример, который позволяет пользователю решить, как вернуть дату, где день больше, чем количество дней в месяце.
источник
учитывая, что ваша переменная datetime называется date:
источник
Общая функция, чтобы получить следующую дату после / до х месяцев.
источник
Быстрое предложение - Стрелка
стрелка установки пипа
источник
Используйте модуль python datetime, чтобы добавить timedelta из шести месяцев в datetime.today ().
http://docs.python.org/library/datetime.html
Вы, конечно , придется решать вопрос , поднятый Johannes Weiß-- что делать вы имеете в виду на 6 месяцев?
источник
Это то, что я придумал. Он перемещает правильное количество месяцев и лет, но игнорирует дни (это было то, что мне было нужно в моей ситуации).
источник
Я использую эту функцию, чтобы изменить год и месяц, но сохранить день:
Вы должны написать:
источник
Я думаю, что было бы безопаснее сделать что-то подобное, а не добавлять дни вручную:
источник