Estoy usando el módulo de fecha y hora de Python. Estoy buscando calcular la fecha 6 meses a partir de la fecha actual. ¿Podría alguien darme un poco de ayuda para hacer esto?
La razón por la que quiero generar una fecha 6 meses después de la fecha actual es para producir una fecha de revisión . Si el usuario ingresa datos en el sistema, tendrá una fecha de revisión de 6 meses a partir de la fecha en que ingresó los datos.
6
, con soporte para pasar el año (y volver al mes1
) si pasamos diciembre. Esto es exactamente lo querelativedelta
hace y es, de hecho, lo que hace cada lenguaje de programación con soporte para este tipo de concepto.date(2015, 3, 31) + relativedelta(months = 6)
dadatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
da2000-10-01T00:00:00
. Php:date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
da 2000-10-01. Elige tu veneno.Respuestas:
Encontré que esta solución es buena. (Esto usa la extensión python-dateutil )
La ventaja de este enfoque es que se ocupa de los problemas con 28, 30, 31 días, etc. Esto se vuelve muy útil en el manejo de reglas y escenarios comerciales (por ejemplo, generación de facturas, etc.)
fuente
relativedelta
función también tomamonth
como argumento, que básicamente reemplaza / establece / arregla el mes en la fecha aprobada, que es muy diferente a agregar más meses. Solo una advertencia para las personas que se preguntan si la función está rota porque olvidaron los s adicionales en meses .datetime
por defecto. De hecho, supuse que podía pasar "meses" en timedelta.Bueno, eso depende de lo que quieras decir con 6 meses a partir de la fecha actual.
Usando meses naturales:
Usando la definición de un banquero, 6 * 30:
fuente
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
puede tener errores, ya que genera fechas no válidas como(31, 8, 2015)
->(31, 2, 2016)
Con Python 3.x puedes hacerlo así:
pero necesitará instalar el módulo python-dateutil :
fuente
pip install ...
from dateutil.relativedelta import relativedelta
. El usoimport *
no es explícito.Para el inicio del cálculo de mes a mes:
fuente
¿Qué quieres decir con "6 meses"?
¿Es 2009-02-13 + 6 meses == 2009-08-13? ¿O es 2009-02-13 + 6 * 30 días?
Más información sobre mx.DateTime
fuente
Entonces, aquí hay un ejemplo de
dateutil.relativedelta
lo que encontré útil para iterar durante el año pasado, omitiendo un mes cada vez hasta la fecha actual:Al igual que con las otras respuestas, debe averiguar qué quiere decir realmente con "6 meses a partir de ahora". Si quiere decir "el día de hoy del mes en el mes seis años en el futuro", esto haría:
fuente
Esta solución funciona correctamente para diciembre, lo que la mayoría de las respuestas en esta página no. Primero debe cambiar los meses de la base 1 (es decir, Jan = 1) a la base 0 (es decir, Jan = 0) antes de usar el módulo (%) o la división entera (//), de lo contrario, noviembre (11) más 1 mes le da 12 , que al encontrar el resto (12% 12) da 0.
(¡Y no sugiera "(mes% 12) + 1" u Oct + 1 = diciembre!)
Sin embargo ... Esto no tiene en cuenta un problema como el 31 de enero + un mes. Entonces volvemos al OP: ¿qué quiere decir con agregar un mes? Una solución es retroceder hasta llegar a un día válido, dado que la mayoría de las personas presumirían que el último día de enero, más un mes, es igual al último día de febrero. Esto también funcionará en números negativos de meses. Prueba:
fuente
Sé que esto fue durante 6 meses, sin embargo, la respuesta se muestra en Google para "agregar meses en Python" si agrega un mes:
esto contaría los días en el mes actual y los agregaría a la fecha actual, el uso de 365/12 podría agregar 1/12 de un año puede causar problemas durante meses cortos / largos si está iterando durante la fecha.
fuente
No hay forma directa de hacerlo con la fecha y hora de Python.
Echa un vistazo al tipo relativo delta en python-dateutil . Le permite especificar un delta de tiempo en meses.
fuente
Simplemente use el método timetuple para extraer los meses, agregar sus meses y crear un nuevo objeto de fecha. Si ya existe un método para esto, no lo sé.
La API es un poco torpe, pero funciona como un ejemplo. Obviamente, tampoco funcionará en casos de esquina como 2008-01-31 + 1 mes. :)
fuente
new_month % 12
debería ser(new_month % 12) or 12
. De lo contrario, si intenta esto en noviembre, obtendrá un error. :)El paquete Dateutil tiene implementación de dicha funcionalidad. Pero tenga en cuenta que esto será ingenuo , como ya señalaron otros.
fuente
Usando bibliotecas estándar de Python, es decir, sin
dateutil
u otras, y resolviendo el problema del '31 de febrero':Pruebas:
fuente
add_months(datetime.date(2018, 11, 30), 1)
devolucionesdatetime.date(2019, 12, 30)
(el año debe ser 2018, no 2019). ¡Entonces, mejor use una biblioteca dedicada y bien probada para esto! Si realmente necesita usar solo módulos de biblioteca estándar, vea mi respuesta a una pregunta similar .Tengo una mejor manera de resolver el problema del '31 de febrero':
Creo que también funciona con números negativos (para restar meses), pero no lo he probado mucho.
fuente
La clase QDate de PyQt4 tiene una función addmonths.
fuente
¿Qué tal esto? ¿No estás usando otra biblioteca (
dateutil
) otimedelta
? Sobre la base de la respuesta de Vartec , hice esto y creo que funciona:Intenté usarlo
timedelta
, pero porque está contando los días,365/2
o6*356/12
no siempre se traduce en 6 meses, sino en 182 días. p.ejCreo que generalmente asumimos que 6 meses a partir de un día determinado aterrizarán el mismo día del mes pero 6 meses después (es decir,
2015-03-10
->2015-09-10
, No2015-09-08
)Espero que esto le sea útil.
fuente
day + datetime.timedelta(6*365/12)
no funcionará siempre, ya que algunos años tienen 365 días y otros tienen 366 días.Esto no responde la pregunta específica (
datetime
solo usando ) pero, dado que otros sugirieron el uso de diferentes módulos, aquí hay una solución usandopandas
.Que funciona como se esperaba en los años bisiestos
fuente
Modificó AddMonths () para usar en Zope y manejar números de día no válidos:
fuente
fuente
fuente
Respuesta de Johannes Wei modificada en el caso 1new_month = 121. Esto funciona perfectamente para mí. Los meses pueden ser positivos o negativos.
fuente
Otra solución más: espero que a alguien le guste:
Esta solución no funciona durante los días 29, 30, 31 para todos los casos, por lo que se necesita una solución más robusta (que ya no es tan agradable :)):
fuente
De esta respuesta , vea parsedatetime . El ejemplo de código sigue. Más detalles: prueba de unidad con muchos ejemplos de conversión en lenguaje natural -> AAAA-MM-DD , y desafíos / errores aparentes de conversión en tiempo de análisis .
El código anterior genera lo siguiente desde una máquina MacOSX:
fuente
Aquí hay un ejemplo que permite al usuario decidir cómo devolver una fecha en la que el día es mayor que la cantidad de días en el mes.
fuente
dado que su variable de fecha y hora se llama fecha:
fuente
Función general para obtener la próxima fecha después / antes de x meses.
fuente
Una sugerencia rápida es Arrow
flecha de instalación de pip
fuente
Use el módulo de fecha y hora de Python para agregar un intervalo de tiempo de seis meses a datetime.today ().
http://docs.python.org/library/datetime.html
Por supuesto, tendrá que resolver el problema planteado por Johannes Weiß: ¿ qué quiere decir con 6 meses?
fuente
Esto es lo que se me ocurrió. Mueve la cantidad correcta de meses y años, pero ignora los días (que era lo que necesitaba en mi situación).
fuente
Utilizo esta función para cambiar año y mes, pero mantener el día:
Deberías escribir:
fuente
Creo que sería más seguro hacer algo como esto en lugar de agregar días manualmente:
fuente