Посмотрев, какой месяц равен 32 дням, вы можете определить, является ли это последним днем месяца и существует ли дата в следующем месяце. Это связано с тем, что хотя бы один из двух месяцев подряд содержит 31 день
from datetime import date, timedelta
def in_a_month(d):
in_32_days = d + timedelta(32)
if (in_32_days.month - d.month) % 12 > 1:
return in_32_days - timedelta(in_32_days.day)
else:
return date(in_32_days.year, in_32_days.month, d.day)
Или если вам нужно решение для добавления или удаления произвольного количества месяцев
from datetime import date, timedelta
def last_day_in_month(a_date, months_forward = 0):
month_index = a_date.year * 12 + a_date.month + months_forward
y = month_index // 12
m = (month_index % 12) + 1
return date(y, m, 1) - timedelta(1)
def add_month(a_date, months = 1):
is_last_day = a_date == last_day_in_month(a_date)
last_in_target_month = last_day_in_month(a_date, months)
if is_last_day or a_date.day > last_in_target_month.day:
return last_in_target_month
else:
return last_in_target_month.replace(day = a_date.day)