Si todo lo que desea es cualquier día del último mes, lo más simple que puede hacer es restar el número de días de la fecha actual, lo que le dará el último día del mes anterior.
Por ejemplo, comenzando con cualquier fecha:
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2016, 5, 24)
Restando los días de la fecha actual obtenemos:
>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)
Esto es suficiente para su necesidad simplificada de cualquier día del último mes.
Pero ahora que lo tiene, también puede obtener cualquier día del mes, incluido el mismo día con el que comenzó (es decir, más o menos lo mismo que restar un mes):
>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)
Por supuesto, debe tener cuidado con el 31 en un mes de 30 días o los días que faltan de febrero (y cuidar los años bisiestos), pero eso también es fácil de hacer:
>>> 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
obras y medios laif not m: m = 12
pueden quedar eliminadodt - timedelta(days=dt.day)
como se expresó originalmente, aunque parecía que querían poder restar un número arbitrario de meses y eso es un poco más difícil.