Obtener objeto de fecha para el primer/último día del año actual

4 minutos de lectura

Avatar de usuario de ThiefMaster
ladrónmaestro

Necesito conseguir date objetos para el primer y último día del año en curso.

Actualmente estoy usando este código que funciona bien, pero tengo curiosidad por saber si hay una mejor manera de hacerlo; por ejemplo, sin tener que especificar el mes/día manualmente.

from datetime import date
a = date(date.today().year, 1, 1)
b = date(date.today().year, 12, 31)

  • No estoy seguro de clasificar su solución como una solución manual; de hecho, es mucho más claro y, por lo tanto, “mejor” que las alternativas que implican aritmética de fechas.

    – Andrew Skirrow

    24 de marzo de 2011 a las 10:32

  • Creo que esto es lo más “agradable” que vas a conseguir. ¿Qué es exactamente lo que no te gusta de este código?

    – ENP

    24 de marzo de 2011 a las 10:40


  • En realidad, solo quería saber si hay alguna función para obtener, por ejemplo, el primer/último día de un mes del que no he oído hablar.

    – ThiefMaster

    24 de marzo de 2011 a las 10:52

  • calendar.monthrange(year,month) da el primer/último día del mes. Sin embargo, no veo cómo eso ayudaría a su código.

    – ENP

    24 de marzo de 2011 a las 10:55

  • parece que estás perdiendo el último día en realidad.

    – shabunc

    12 de agosto de 2013 a las 15:57

La única mejora real que se me ocurre es dar a las variables nombres más descriptivos que a y b.

  • Esos fueron solo un ejemplo. Estoy usando esos dos objetos de fecha en una llamada de función.

    – ThiefMaster

    24 de marzo de 2011 a las 10:49

  • @ThiefMaster Bastante justo. Creo que ayudaría a obtener buenas respuestas si describiera exactamente qué es lo que le parece poco elegante de su código.

    – ENP

    24 de marzo de 2011 a las 10:52

  • Además, no es necesario llamar a today() dos veces, guárdelo en una variable.

    –Ryan Allen

    31/03/2015 a las 19:00


from datetime import datetime

starting_day_of_current_year = datetime.now().date().replace(month=1, day=1)    
ending_day_of_current_year = datetime.now().date().replace(month=12, day=31)

  • Algún contexto o explicación podría ayudar a aquellos que buscan esta solución en el futuro.

    – Toby

    14 mayo 2017 a las 15:56

Tendrás algunas cosas raras si llegas tan tarde en la víspera de Año Nuevo y las dos llamadas a today() cruzar el límite del año. Es más seguro hacer esto:

from datetime import date

epoch_year = date.today().year
year_start = date(epoch_year, 1, 1)
year_end = date(epoch_year, 12, 31)

avatar de usuario de danio
danio

No hay nada en la biblioteca de python, pero hay bibliotecas externas que envuelven esta funcionalidad. Por ejemplo, pandas tiene una biblioteca de series temporales, con la que puedes hacer:

from datetime import date
from pandas.tseries import offsets

a = date.today() - offsets.YearBegin()
b = date.today() + offsets.YearEnd()

Mientras que pandas es excesivo si todo lo que desea es la funcionalidad de inicio y fin de año, también tiene soporte para muchos otros conceptos de alto nivel, como días hábiles, calendarios de vacaciones, compensaciones de mes/trimestre/año: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects

import datetime
year = 2016
first_day_of_year = datetime.date.min.replace(year = year)
last_day_of_year = datetime.date.max.replace(year = year)
print(first_day_of_year, last_day_of_year)

¿Qué pasa si queremos obtener la hora exacta en que comienza o termina el año? La misma cosa. Reemplazar datetime.date con datetime.datetimey ahí lo tienes, tienes el primer último día del año en datetime.datetime formato.

Para hacer esto aún más elegante, envuelve todo en una función:

import datetime

def year_range(year, datetime_o = datetime.date):
    return (
        datetime_o.min.replace(year = year),
        datetime_o.max.replace(year = year)        
    )

print(year_range(2016, datetime.date))
print(year_range(2016, datetime.datetime))

Producción:

(datetime.date(2016, 1, 1), datetime.date(2016, 12, 31))
(datetime.datetime(2016, 1, 1, 0, 0), datetime.datetime(2016, 12, 31, 23, 59, 59, 999999))

avatar de usuario de kazem qanati
kazem qanati

una forma ingeniosa de averiguar el primer y último día del año es el código debajo de este código funciona bien incluso para los años bisiestos

    first_day=datetime.date(year=i,month=1, day=1)
    first_day_of_next_year=first_day.replace(year=first_day.year+1,month=1, day=1)
    last_day=first_day_of_next_year-jdatetime.timedelta(days=1)


               

use timedelta relativo y reste del objeto de fecha

from dateutil.relativedelta import relativedelta
import datetime

date = datetime.date.today()
fistOfYear = date - relativedelta(years=0, month=1, day=1)

  • El OP quería evitar especificar valores de mes y día.

    – AlexK

    18 de noviembre de 2022 a las 6:21

¿Ha sido útil esta solución?