Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using datetime.timedelta to add years

I am doing some time calculations in Python.

Goal:

Part of this is trying to :

Given a date, add time interval (X years, X months, X weeks), return date

ie

  • input args: input_time (datetime.date), interval (datetime.timedelta)
  • return: datetime.date

I looked at the datetime and datetime.timedelta docs

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶.

These seem to work well if I want to add a certain number of hours or weeks. However,

Problem:

  • I am trying to implement an operation such as date + 1 year and can't figure it out

E.g.

start = datetime.datetime(2000, 1, 1)
# expected output: datetime.datetime(2001, 1, 1)


# with the weeks, etc arguments given in timedelta, this fails unsurprisingly e.g 
start + datetime.timedelta(weeks = 52)

# returns datetime.datetime(2000, 12, 30, 0, 0)

Question

  • Is this year-based operation possible with the basic tools of datetime - if so, how would I go about it?

  • I realize that for the year example, I could just do start.replace(year = 2001), but that approach will fail if I have months or weeks as input.

  • From my understanding, the dateutil library has more advanced features, but I was not clear how well it interacts with the in-built datetime objects.

I have reviewed this similar question but it did not help me with this.

Any help is much appreciated!

Running Python 3.6.5 on MacOs.

like image 684
patrick Avatar asked Jan 28 '19 00:01

patrick


People also ask

How do you convert Timedelta to years?

Get the number of days, then divide by 365.2425 (the mean Gregorian year) for years. Divide by 30.436875 (the mean Gregorian month) for months.

How do I add one year to a datetime object?

In pandas, a string is converted to a datetime object using the pd. to_datetime() method. pd. DateOffset() method is used to add years to the created pandas object.

How do you increment years in Python?

Use the datetime. replace() method to add years to a date, e.g. start_date. replace(year=start_date. year + years) .


2 Answers

timedelta does not support years, because the duration of a year depends on which year (for example, leap years have Feb 29).

You could use a relativedelta instead (from PyPI package python-dateutil) which does support years and takes into account the baseline date for additions.

>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> d = datetime.date(2020, 2, 29)
>>> d
datetime.date(2020, 2, 29)
>>> d + relativedelta(years=1)
datetime.date(2021, 2, 28)
like image 70
wim Avatar answered Oct 23 '22 00:10

wim


You can hard code a new year value of the datetime using replace instead :)

This avoids leap years etc.

year_later = current.replace(year=current.year + 1)

Note that if the current date happens to be the 29th of February, this will raise a ValueError with the message: "Day is out of range for month". So you need to handle this special case, like this:

if current.month == 2 and current.day == 29:
    year_later = current.replace(year=current.year + 1, day=28)
else:
    year_later = current.replace(year=current.year + 1)
like image 44
enongad Avatar answered Oct 22 '22 23:10

enongad