Jeśli chcesz tylko dowolnego dnia w ostatnim miesiącu, najprostszą rzeczą, jaką możesz zrobić, jest odjęcie liczby dni od bieżącej daty, co da ci ostatni dzień poprzedniego miesiąca.
Na przykład zaczynając od dowolnej daty:
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2016, 5, 24)
Odejmując dni z bieżącej daty otrzymujemy:
>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)
To wystarczy na uproszczoną potrzebę dowolnego dnia w ostatnim miesiącu.
Ale teraz, gdy go masz, możesz również otrzymać dowolny dzień w miesiącu, w tym ten sam dzień, od którego zacząłeś (czyli mniej więcej to samo, co odejmowanie miesiąca):
>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)
Oczywiście musisz uważać na 31. dnia 30-dniowego miesiąca lub dni brakujące od lutego (i zadbać o lata przestępne), ale to też jest łatwe:
>>> 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)+1działa i oznacza, żeif not m: m = 12puszka zostanie usunięta