¿Hay alguna manera de usar la biblioteca estándar de Python para determinar fácilmente (es decir, una llamada de función) el último día de un mes determinado?
Si la biblioteca estándar no admite eso, ¿el paquete dateutil lo admite?
No noté esto antes cuando estaba mirando la documentación del calendar
módulo , pero un método llamado monthrange
proporciona esta información:
rango de meses (año, mes)
Devuelve el día de la semana del primer día del mes y el número de días del mes, para el año y mes especificados.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
entonces:
calendar.monthrange(year, month)[1]
Parece el camino más sencillo.
Para ser claros, también es monthrange
compatible con los años bisiestos:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
Mi respuesta anterior aún funciona, pero es claramente subóptima.
28
como la respuesta, que es correcta, usando las reglas para el calendario gregorianomonthrange
es un nombre confuso. Pensarías que volvería(first_day, last_day)
, no(week_day_of_first_day, number_of_days)
Si no desea importar el
calendar
módulo, una simple función de dos pasos también puede ser:Salidas:
fuente
EDITAR: Vea la respuesta de @Blair Conrad para una solución más limpia
fuente
today.month + 1 == 13
y obtienes unValueError
.(today.month % 12) + 1
dado que12 % 12
da 0Esto es realmente bastante fácil con
dateutil.relativedelta
(paquete python-datetutil para pip).day=31
siempre volverá el último día del mes.Ejemplo:
fuente
datetime(2014, 2, 1) + relativedelta(days=31)
dadatetime(2014, 3, 4, 0, 0)
...months
se agrega, luego seseconds
resta. Dado que se aprobaron**kwargs
, no confiaría en eso y realizaría una serie de operaciones separadas: lonow + relative(months=+1) + relative(day=1) + relative(days=-1)
cual es inequívoco.last_day = (<datetime_object> + relativedelta(day=31)).day
EDITAR: vea mi otra respuesta . Tiene una mejor implementación que esta, que dejo aquí solo en caso de que alguien esté interesado en ver cómo uno puede "hacer su propia" calculadora.
@John Millikin da una buena respuesta, con la complicación adicional de calcular el primer día del próximo mes.
Lo siguiente no es particularmente elegante, pero para averiguar el último día del mes en el que vive una fecha determinada, puedes intentar:
fuente
today = datetime.date.today(); start_date = today.replace(day=1)
. Debería evitar llamar a datetime.now dos veces, en caso de que lo haya llamado antes de la medianoche del 31 de diciembre y luego justo después de la medianoche. Obtendría 2016-01-01 en lugar de 2016-12-01 o 2017-01-01.date
es una instancia dedatetime.date
,datetime.datetime
y tambiénpandas.Timestamp
.Al
dateutil.relativedelta
usarlo obtendría la última fecha del mes de esta manera:La idea es obtener el primer día del mes y usar
relativedelta
para ir 1 mes adelante y 1 día atrás para obtener el último día del mes que desea.fuente
Otra solución sería hacer algo como esto:
Y usa la función así:
fuente
fuente
fuente
Si está dispuesto a usar una biblioteca externa, visite http://crsmithdev.com/arrow/
U puede obtener el último día del mes con:
Esto devuelve un objeto de fecha que luego puede hacer su manipulación.
fuente
Para obtener la última fecha del mes, hacemos algo como esto:
Ahora, para explicar lo que estamos haciendo aquí, lo dividiremos en dos partes:
primero es obtener el número de días del mes actual para el que usamos el rango de meses que Blair Conrad ya mencionó su solución:
segundo es obtener la última fecha en sí, lo que hacemos con la ayuda de reemplazar, por ejemplo
y cuando los combinamos como se menciona arriba, obtenemos una solución dinámica.
fuente
date.replace(day=day)
para que todos sepan lo que está sucediendo.En Python 3.7 existe la
calendar.monthlen(year, month)
función no documentada :Es equivalente a la
calendar.monthrange(year, month)[1]
llamada documentada .fuente
fuente
¡Usa pandas!
fuente
pd.series.dt.is_month_end
enlacenow=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
Para mí es la forma más simple:
fuente
La forma más fácil (sin tener que importar el calendario) es obtener el primer día del mes siguiente y luego restarle un día.
Salida:
PD: este código se ejecuta más rápido en comparación con el
import calendar
enfoque; vea abajo:SALIDA:
Este código supone que desea la fecha del último día del mes (es decir, no solo la parte DD, sino toda la fecha AAAAMMDD)
fuente
import calendar
?Aquí hay otra respuesta. No se requieren paquetes adicionales.
Obtenga el primer día del próximo mes y reste un día.
fuente
Puede calcular la fecha de finalización usted mismo. La lógica simple es restar un día de la fecha_inicio del próximo mes. :)
Entonces escribe un método personalizado,
Vocación,
Volverá la fecha de finalización de este mes. Pase cualquier fecha a esta función. le devuelve la fecha de finalización de ese mes.
fuente
puede usar relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html
month_end = <your datetime value within the month> + relativedelta(day=31)
que le dará el último día.fuente
Esta es la solución más simple para mí usando solo la biblioteca estándar de fecha y hora:
fuente
Esto no aborda la pregunta principal, pero es un buen truco para obtener el último día de la semana en un mes
calendar.monthcalendar
, que devuelve una matriz de fechas, organizadas con el lunes como la primera columna y el domingo como la última.Todo
[0:-2]
es afeitar las columnas del fin de semana y tirarlas. Las fechas que quedan fuera del mes se indican con 0, por lo que el máximo las ignora efectivamente.El uso de
numpy.ravel
no es estrictamente necesario, pero odio confiar en la mera convención quenumpy.ndarray.max
aplanará la matriz si no se le dice qué eje calcular.fuente
Salida:
Esto imprimirá el último día de cualquier mes actual. En este ejemplo, fue el 15 de mayo de 2016. Por lo tanto, su producción puede ser diferente, sin embargo, la producción será tantos días como el mes actual. Genial si desea verificar el último día del mes ejecutando un trabajo cron diario.
Entonces:
Salida:
A menos que sea el último día del mes.
fuente
Prefiero asi
fuente
Si desea hacer su propia función pequeña, este es un buen punto de partida:
Para esto debes conocer las reglas para los años bisiestos:
fuente
Si pasa en un rango de fechas, puede usar esto:
fuente
En el siguiente código, 'get_last_day_of_month (dt)' le dará esto, con la fecha en formato de cadena como 'AAAA-MM-DD'.
fuente
La forma más simple es usar
datetime
y algunas matemáticas de fechas, por ejemplo, restar un día del primer día del mes siguiente:Alternativamente, puede usar
calendar.monthrange()
para obtener la cantidad de días en un mes (teniendo en cuenta los años bisiestos) y actualizar la fecha en consecuencia:Un punto de referencia rápido muestra que la primera versión es notablemente más rápida:
fuente
Aquí hay una versión larga (fácil de entender) pero se ocupa de los años bisiestos.
saludos, JK
fuente
else: pass
y también puede deshacerseif year % 400 == 0: leap_year_flag = 1
con modificaciones menoresAquí hay una solución basada en python lambdas:
La
next_month
lambda encuentra la representación de la tupla del primer día del mes siguiente y pasa al año siguiente. Lamonth_end
lambda transforma una fecha (dte
) en una tupla, aplicanext_month
y crea una nueva fecha. Entonces el "fin de mes" es solo el primer día del mes siguiente menostimedelta(days=1)
.fuente