# Is there a cleaner way of building a list of the previous, next months than this?

At first I tried using a timedelta but it doesn't accept months as an argument, so my next working example is this:

from datetime import datetime
current_date = datetime.now()

months = []
for month_adjust in range(2, -3, -1): # Order by new to old.
# If our months are out of bounds we need to change year.
if current_date.month + month_adjust <= 0:
year = current_date.year - 1
elif current_date.month + month_adjust > 12:
year = current_date.year + 1
else:
year = current_date.year
# Keep the months in bounds.
month = (current_date.month + month_adjust) % 12
if month == 0: month = 12
months.append(current_date.replace(year, month=month, day=1))


Is there a cleaner way?

-

Based on this answer, I would do something like :

from datetime import date
from dateutil.relativedelta import relativedelta
today = date.today()
months = [today + relativedelta(months = +i) for i in range(2,-3,-1)]


It's always better not to have to play with the dates manually as so many things can go wrong.

(I don't have access to a machine with relativedelta here so it's not tested but I'm pretty confident it should work)

-
That is wonderful, thanks! BTW you can drop the + in +i. :) – Kit Sunde Jan 6 '13 at 23:35
Also you don't need the .month in the list compression as I need the date object. – Kit Sunde Jan 6 '13 at 23:41