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)
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)
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.datetime
y 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))
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
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