Añadir un año en la fecha actual PYTHON

He recuperado una fecha de la base de datos con la siguiente variable

{{ i.operation_date }} 

con la que tengo un valor como

 April 1, 2013 

Necesito agregar un año a lo anterior, para poder obtener

 April 1, 2014 

Por favor sugerir, ¿cómo puedo hacer esto?

La respuesta de AGSM muestra una manera conveniente de resolver este problema utilizando el paquete python-dateutil . ¿Pero qué pasa si no quieres instalar ese paquete? Podrías resolver el problema en Python vainilla así:

 from datetime import date def add_years(d, years): """Return a date that's `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)) 

Si desea la otra posibilidad (cambiar del 29 de febrero al 28 de febrero), la última línea debe cambiarse a:

  return d + (date(d.year + years, 3, 1) - date(d.year, 3, 1)) 

Puede usar el relativedelta de Python-dateutil para incrementar un objeto de datetime y datetime mientras se mantiene sensible a cosas como años bisiestos y longitudes de meses. Python-dateutil viene empaquetado con matplotlib si ya tiene eso. Puedes hacer lo siguiente:

 from dateutil.relativedelta import relativedelta new_date = old_date + relativedelta(years=1) 

(Esta respuesta fue dada por @Max a una pregunta similar ).

Pero si su fecha es una cadena (es decir, no es un objeto datetime ), puede convertirla usando 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 contendrá “1 de abril de 2013”.

NB: Desafortunadamente, datetime solo genera valores de día como “números decimales”, es decir, con ceros iniciales si son números de un solo dígito. El .replace() al final es una solución para solucionar este problema copiado de @Alex Martelli (consulte esta pregunta para conocer su y otros enfoques de este problema).

De su pregunta parece que le gustaría simplemente incrementar el año de su fecha dada en lugar de preocuparse por las implicaciones del año bisiesto. Puede usar la clase de fecha para hacer esto accediendo a su año de miembro.

 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) 

Si tiene problemas para crear uno dado su formato, háganoslo saber.

Esto es lo que hago cuando necesito agregar meses o años y no quiero importar más bibliotecas. Simplemente cree un objeto datetime.date (), llame a add_month (fecha) para agregar un mes y add_year (fecha) para agregar un año.

 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))) 

Mira esto:

 #!/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 

Ejemplo de uso:

 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) 

Y salida de este ejemplo:

 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 

convertirlo en objeto datetime de Python si no lo es ya. a continuación, agregue deltatime

 one_years_later = Your_date + datetime.timedelta(days=(years*days_per_year)) 

para sus días de caso = 365.

Usted puede tener una condición para verificar si el año es bisiesto o nulo y ajustar los días en consecuencia

Puedes agregar tantos años como quieras