How Do You Add "3 Months" To A Datetime.date Object In Python?
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?"