Если вам нужен любой день последнего месяца, самое простое, что вы можете сделать, - это вычесть количество дней из текущей даты, что даст вам последний день предыдущего месяца.
Например, начиная с любой даты:
>>> 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банка будет удалена