Добавить год в текущую дату ПИТОН
Я получил дату из базы данных со следующей переменной
{{ i.operation_date }}
с которым я получил значение, подобное
April 1, 2013
Мне нужно добавить один год к предыдущему, чтобы я мог получить
April 1, 2014
Пожалуйста, предложите, как я могу это сделать?
Ответы
Ответ 1
Ответ AGSM показывает удобный способ решения этой проблемы с помощью python-dateutil
пакет. Но что, если вы не хотите устанавливать этот пакет? Вы можете решить проблему в ванильном Python следующим образом:
from datetime import date
def add_years(d, years):
"""Return a date that `years` years after the date (or datetime)
object `d`. Return the same calendar date (month and day) in the
destination year, if it exists, otherwise use the following day
(thus changing February 29 to March 1).
"""
try:
return d.replace(year = d.year + years)
except ValueError:
return d + (date(d.year + years, 1, 1) - date(d.year, 1, 1))
Если вы хотите другую возможность (с 29 февраля по 28 февраля), то последняя строка должна быть изменена на:
return d + (date(d.year + years, 3, 1) - date(d.year, 3, 1))
Ответ 2
Вы можете использовать relativedelta
дельту Python-dateutil для увеличения объекта datetime
, оставаясь чувствительным к таким вещам, как високосные годы и месяцы. Python-dateutil поставляется с matplotlib, если он у вас уже есть. Вы можете сделать следующее:
from dateutil.relativedelta import relativedelta
new_date = old_date + relativedelta(years=1)
(Этот ответ был дан @Max на аналогичный вопрос).
Но если ваша дата является строкой (т.е. Не является объектом datetime
), вы можете преобразовать ее, используя datetime:
from datetime import datetime
from dateutil.relativedelta import relativedelta
your_date_string = "April 1, 2012"
format_string = "%B %d, %Y"
datetime_object = datetime.strptime(your_date_string, format_string).date()
new_date = datetime_object + relativedelta(years=1)
new_date_string = datetime.strftime(new_date, format_string).replace(' 0', ' ')
new_date_string
будет содержать "1 апреля 2013".
NB. К сожалению, datetime
выводит значения дня только как "десятичные числа", то есть с ведущими нулями, если они однозначные. .replace()
в конце - это обходной путь для решения этой проблемы, скопированный с @Alex Martelli (см. Этот вопрос для его и других подходов к этой проблеме).
Ответ 3
По вашему вопросу, похоже, вы хотели бы просто увеличить год вашей даты, а не беспокоиться о последствиях високосного года. Вы можете использовать класс даты, чтобы сделать это, обратившись к году его членства.
from datetime import date
startDate = date(2012, 12, 21)
# reconstruct date fully
endDate = date(startDate.year + 1, startDate.month, startDate.day)
# replace year only
endDate = startDate.replace(startDate.year + 1)
Если у вас возникли проблемы с созданием определенного формата, сообщите нам.
Ответ 4
Это то, что я делаю, когда мне нужно добавлять месяцы или годы и не хочу импортировать больше библиотек.
Просто создайте объект datetime.date(), вызовите add_month (date), чтобы добавить месяц и add_year (date), чтобы добавить год.
import datetime
__author__ = 'Daniel Margarido'
# Check if the int given year is a leap year
# return true if leap year or false otherwise
def is_leap_year(year):
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
return True
else:
return False
else:
return True
else:
return False
THIRTY_DAYS_MONTHS = [4, 6, 9, 11]
THIRTYONE_DAYS_MONTHS = [1, 3, 5, 7, 8, 10, 12]
# Inputs -> month, year Booth integers
# Return the number of days of the given month
def get_month_days(month, year):
if month in THIRTY_DAYS_MONTHS: # April, June, September, November
return 30
elif month in THIRTYONE_DAYS_MONTHS: # January, March, May, July, August, October, December
return 31
else: # February
if is_leap_year(year):
return 29
else:
return 28
# Checks the month of the given date
# Selects the number of days it needs to add one month
# return the date with one month added
def add_month(date):
current_month_days = get_month_days(date.month, date.year)
next_month_days = get_month_days(date.month + 1, date.year)
delta = datetime.timedelta(days=current_month_days)
if date.day > next_month_days:
delta = delta - datetime.timedelta(days=(date.day - next_month_days) - 1)
return date + delta
def add_year(date):
if is_leap_year(date.year):
delta = datetime.timedelta(days=366)
else:
delta = datetime.timedelta(days=365)
return date + delta
# Validates if the expected_value is equal to the given value
def test_equal(expected_value, value):
if expected_value == value:
print "Test Passed"
return True
print "Test Failed : " + str(expected_value) + " is not equal to " str(value)
return False
# Test leap year
print "---------- Test leap year ----------"
test_equal(True, is_leap_year(2012))
test_equal(True, is_leap_year(2000))
test_equal(False, is_leap_year(1900))
test_equal(False, is_leap_year(2002))
test_equal(False, is_leap_year(2100))
test_equal(True, is_leap_year(2400))
test_equal(True, is_leap_year(2016))
# Test add month
print "---------- Test add month ----------"
test_equal(datetime.date(2016, 2, 1), add_month(datetime.date(2016, 1, 1)))
test_equal(datetime.date(2016, 6, 16), add_month(datetime.date(2016, 5, 16)))
test_equal(datetime.date(2016, 3, 15), add_month(datetime.date(2016, 2, 15)))
test_equal(datetime.date(2017, 1, 12), add_month(datetime.date(2016, 12, 12)))
test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 31)))
test_equal(datetime.date(2015, 3, 1), add_month(datetime.date(2015, 1, 31)))
test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 30)))
test_equal(datetime.date(2016, 4, 30), add_month(datetime.date(2016, 3, 30)))
test_equal(datetime.date(2016, 5, 1), add_month(datetime.date(2016, 3, 31)))
# Test add year
print "---------- Test add year ----------"
test_equal(datetime.date(2016, 2, 2), add_year(datetime.date(2015, 2, 2)))
test_equal(datetime.date(2001, 2, 2), add_year(datetime.date(2000, 2, 2)))
test_equal(datetime.date(2100, 2, 2), add_year(datetime.date(2099, 2, 2)))
test_equal(datetime.date(2101, 2, 2), add_year(datetime.date(2100, 2, 2)))
test_equal(datetime.date(2401, 2, 2), add_year(datetime.date(2400, 2, 2)))
Ответ 5
Посмотрите на это:
#!/usr/bin/python
import datetime
def addYears(date, years):
result = date + datetime.timedelta(366 * years)
if years > 0:
while result.year - date.year > years or date.month < result.month or date.day < result.day:
result += datetime.timedelta(-1)
elif years < 0:
while result.year - date.year < years or date.month > result.month or date.day > result.day:
result += datetime.timedelta(1)
print "input: %s output: %s" % (date, result)
return result
Пример использования:
addYears(datetime.date(2012,1,1), -1)
addYears(datetime.date(2012,1,1), 0)
addYears(datetime.date(2012,1,1), 1)
addYears(datetime.date(2012,1,1), -10)
addYears(datetime.date(2012,1,1), 0)
addYears(datetime.date(2012,1,1), 10)
И вывод этого примера:
input: 2012-01-01 output: 2011-01-01
input: 2012-01-01 output: 2012-01-01
input: 2012-01-01 output: 2013-01-01
input: 2012-01-01 output: 2002-01-01
input: 2012-01-01 output: 2012-01-01
input: 2012-01-01 output: 2022-01-01
Ответ 6
Другой способ - использовать класс "DateOffset" для панд.
ссылка: - https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.tseries.offsets.DateOffset.html
Используя код ASGM (выше в ответах):
from datetime import datetime
import pandas as pd
your_date_string = "April 1, 2012"
format_string = "%B %d, %Y"
datetime_object = datetime.strptime(your_date_string, format_string).date()
new_date = datetime_object + pd.DateOffset(years=1)
new_date.date()
Он вернет объект datetime с добавленным годом.
Что-то вроде этого:-
datetime.date(2013, 4, 1)
Ответ 7
преобразовать его в объект datetime python, если он еще не был. затем добавьте deltatime
one_years_later = Your_date + datetime.timedelta(days=(years*days_per_year))
для вашего случая дней = 365.
у вас может быть условие, чтобы проверить, является ли год прыжком или нет, и соответственно отрегулируйте дни.
вы можете добавить столько лет, сколько хотите