Se tutto quello che vuoi è un giorno nell'ultimo mese, la cosa più semplice che puoi fare è sottrarre il numero di giorni dalla data corrente, che ti darà l'ultimo giorno del mese precedente.
Ad esempio, a partire da qualsiasi data:
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2016, 5, 24)
Sottraendo i giorni della data corrente otteniamo:
>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)
Questo è sufficiente per il tuo bisogno semplificato di qualsiasi giorno nell'ultimo mese.
Ma ora che ce l'hai, puoi anche ottenere qualsiasi giorno del mese, incluso lo stesso giorno in cui hai iniziato (cioè più o meno lo stesso che sottraendo un mese):
>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)
Certo, devi stare attento con il 31 su un mese di 30 giorni o ai giorni mancanti da febbraio (e prenditi cura degli anni bisestili), ma è anche facile:
>>> 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)+1funziona e significa che laif not m: m = 12lattina viene rimossa