Вы можете начать с даты и времени 2018-1-1
и добавить к этому диапазон от 0
до 364/365
дней:
import datetime
def getDays(year):
"""Generates all days in one year, respecting leap years. Uses Gregorian
calendarso best keep the year post 1582."""
def isLeap(y):
return y%4 == 0 and ( not y % 100 == 0 or y % 400 == 0)
dt = datetime.date(year,1,1)
days = 365 + (1 if isLeap(dt.year) else 0) # needs the (..) due to operator precedence
return (dt + datetime.timedelta(days=k) for k in range( days ) )
print(list(getDays(2018)))
Выход:
[datetime.date(2018, 1, 1), datetime.date(2018, 1, 2), datetime.date(2018, 1, 3), ...,
datetime.date(2018, 12, 29), datetime.date(2018, 12, 30), datetime.date(2018, 12, 31)]
Leapyears:
for y in [1900,2000]:
d = list(getDays(y))
print(d[58:60], d[-1:])
Ouput:
# 1900 - not a leap yeaer
[datetime.date(1900, 2, 28), datetime.date(1900, 3, 1)] [datetime.date(1900, 12, 31)]
# 2000 - a leap year
[datetime.date(2000, 2, 28), datetime.date(2000, 2, 29)] [datetime.date(2000, 12, 31)]