# This give you the last day of the month given on second index
from calendar import monthrange
monthrange(2012, 2)
>>> (2, 29)
import datetime
date = datetime.datetime.now()
>>> datetime.datetime(2018, 7, 4, 1, 46, 10, 112669)
date.replace(day = calendar.monthrange(date.year, date.month)[1])
>>> datetime.datetime(2018, 7, 31, 1, 46, 10, 112669)
# Gives the date with last day of month
# You can easily calculate this using rrule from dateutil module:
from dateutil import rrule
from datetime import date
list(rrule.rrule(rrule.MONTHLY, dtstart=date(2018, 1, 1), until=date(2018, 5, 1)))
>>> [datetime.datetime(2018, 1, 1, 0, 0), datetime.datetime(2018, 2, 1, 0, 0), datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 5, 1, 0,
0)]
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime(str('2018-05-01 12:00:00'), '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime(str('2018-05-30'), '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
# Print total months between dates
r.months
>>> 1