Skip to content Skip to sidebar Skip to footer

How Do You Add "3 Months" To A Datetime.date Object In Python?

Python date calculations, where art thou? I have a python app that needs to plot out dates every three months for several years. It's important that the dates occur exactly 4 time

Solution 1:

If you're looking for exact or "more precise" dates, you're probably better off checking out dateutil.

Quick example:

>>>from dateutil.relativedelta import relativedelta>>>import datetime>>>TODAY = datetime.date.today()>>>TODAY
datetime.date(2012, 3, 6)

Now add 3 months to TODAY, observe that it matches the day exactly (Note that relativedelta(months=3) and relativedelta(month=3) have different behaviors. Make sure to use months for these examples!).

>>>three_mon_rel = relativedelta(months=3)>>>TODAY + three_mon_rel
datetime.date(2012, 6, 6)

And it stays consistent throughout the course of a year. Literally every three months, on the day (had to keep adding because for some reason multiplying a relativedelta and adding it to a datetime.date object throws a TypeError):

>>>TODAY + three_mon_rel + three_mon_rel
datetime.date(2012, 9, 6)
>>>TODAY + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2012, 12, 6)
>>>TODAY + three_mon_rel + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2013, 3, 6)

Whereas the mVChr's suggested solution, while definitely "good enough", drifts slightly over time:

>>>three_mon_timedelta = datetime.timedelta(days=3 * 365/12)>>>TODAY + three_mon_timedelta
datetime.date(2012, 6, 5)

And over the course of a year, the day of month keeps sliding:

>>>TODAY + three_mon_timedelta * 2
datetime.date(2012, 9, 4)
>>>TODAY + three_mon_timedelta * 3
datetime.date(2012, 12, 4)
>>>TODAY + three_mon_timedelta * 4
datetime.date(2013, 3, 5)

Solution 2:

import datetime

some_date = datetime.date.today()
three_months = datetime.timedelta(3*365/12)
print (some_date + three_months).isoformat()
# => '2012-06-01'

Then "normalize" every new year to the original date's day (unless Feb 29)

Solution 3:

Using Python standard libraries, i.e. without dateutil or others, and solving the 'February 31st' problem:

import datetime
import calendar

def add_months(date, months):
    months_count = date.month + months

    # Calculate the yearyear= date.year +int(months_count /12)

    # Calculate the monthmonth= (months_count %12)
    if month==0:
        month=12

    # Calculate the dayday= date.day
    last_day_of_month = calendar.monthrange(year, month)[1]
    if day> last_day_of_month:
        day= last_day_of_month

    new_date = datetime.date(year, month, day)
    return new_date

Testing:

>>>date = datetime.date(2018, 11, 30)
>>>print(date, add_months(date, 3))
(datetime.date(2018, 11, 30), datetime.date(2019, 2, 28))

>>>print(date, add_months(date, 14))
(datetime.date(2018, 12, 31), datetime.date(2020, 2, 29))

Solution 4:

here is a good solution http://www.voidspace.org.uk/python/weblog/arch_d7_2012_02_25.shtml#e1235

edit ah standard way sorry...

Solution 5:

I wrote this function that may be able to help you:

import datetime
import calendar

def add_months(date, months):

    # Determine the monthandyearof the newdatemonth, year= (date+ relativedelta(months=months)).month, (date+ relativedelta(months=months)).year

    # Determine the dayof the newdate
    # If the dayof the currentdateisat the endof the month,
    # the dayof the newdate should also be at the endof the month
    if(date.day == calendar.monthrange(date.year, date.month)[1]):
        day= calendar.monthrange(year, month)[1]
    else:
        day= date.day

    new_date = datetime.datetime(year, month, day)
    return new_date

It supports adding negative months as well (i.e. subtracting months).

Here is some sample usage that illustrates how to obtain 2021 and 2022 dates as per your specs:

import datetime

a = datetime.datetime(2020, 1, 1)

# Initialse a list to hold the dates
dates = [0]*8# Obtain the datesfor i inrange(0, len(dates)):
    dates[i] = add_months(a, 3*i)

dates

Post a Comment for "How Do You Add "3 Months" To A Datetime.date Object In Python?"