Якщо все, що вам потрібно, це будь-який день минулого місяця, найпростіше, що ви можете зробити, - це відняти кількість днів від поточної дати, яка дасть вам останній день попереднього місяця.
Наприклад, починаючи з будь-якої дати:
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2016, 5, 24)
Віднімаючи дні поточної дати, отримуємо:
>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)
Цього достатньо для спрощеної потреби в будь-який день минулого місяця.
Але тепер, коли він у вас є, ви також можете отримати будь-який день місяця, включаючи той самий день, з якого почали (тобто більш-менш те саме, що відняти місяць):
>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)
Звичайно, потрібно бути обережним з 31 числа 30-го місяця або днів, що пропали з лютого (і подбати про високосний рік), але це також легко зробити:
>>> a_date = datetime.date(2016, 3, 31)
>>> last_day_previous_month = a_date - datetime.timedelta(days=a_date.day)
>>> a_date_minus_month = (
... last_day_previous_month.replace(day=a_date.day)
... if a_date.day < last_day_previous_month.day
... else last_day_previous_month
... )
>>> a_date_minus_month
datetime.date(2016, 2, 29)
((date.month+delta-1) % 12)+1працює і означає, щоif not m: m = 12