Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas add one day to column

Tags:

python

pandas

I need to add 1 day to each date I want to get the begining date of the following month eg 2014-01-2014 for the 1st item in the dataframe. Tried:

montdist['date'] + pd.DateOffset(1) 

Which gives me:

TypeError: cannot use a non-absolute DateOffset in datetime/timedelta operations [<DateOffset>] 

Have a Dataframe:

    Units   mondist                date 1    6491  0.057785 2013-12-31 00:00:00 2    7377  0.065672 2014-01-31 00:00:00 3    9990  0.088934 2014-02-28 00:00:00 4   10362  0.092245 2014-03-31 00:00:00 5   11271  0.100337 2014-04-30 00:00:00 6   11637  0.103596 2014-05-31 00:00:00 7   10199  0.090794 2014-06-30 00:00:00 8   10486  0.093349 2014-07-31 00:00:00 9    9282  0.082631 2014-08-31 00:00:00 10   8632  0.076844 2014-09-30 00:00:00 11   8204  0.073034 2013-10-31 00:00:00 12   8400  0.074779 2013-11-30 00:00:00 
like image 817
dartdog Avatar asked Dec 09 '13 21:12

dartdog


People also ask

How do I add one day Pandas?

Pandas offers to different functions to add days: the Pandas . Timedelta() function and the Pandas . DateOffset() function.

How do you subtract a day in Pandas?

When the function receives the date string it will first use the Pandas to_datetime() function to convert it to a Python datetime and it will then use the timedelta() function to subtract the number of days defined in the days variable.


2 Answers

Make it a DatetimeIndex first:

pd.DatetimeIndex(montdist['date']) + pd.DateOffset(1) 

Note: I think there is a feature request that this could work with date columns...

In action:

In [11]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])  In [12]: df['date'] = pd.to_datetime(['21-11-2013', '22-11-2013'])  In [13]: pd.DatetimeIndex(df.date) + pd.DateOffset(1) Out[13]:  <class 'pandas.tseries.index.DatetimeIndex'> [2013-11-22 00:00:00, 2013-11-23 00:00:00] Length: 2, Freq: None, Timezone: None  In [14]: pd.DatetimeIndex(df.date) + pd.offsets.Hour(1) Out[14]:  <class 'pandas.tseries.index.DatetimeIndex'> [2013-11-21 01:00:00, 2013-11-22 01:00:00] Length: 2, Freq: None, Timezone: Non 
like image 175
Andy Hayden Avatar answered Oct 14 '22 14:10

Andy Hayden


I think that the cleanest way to do this is a variant of szu's answer. Pandas has nearly full support datetime built into its functionality, so there is no need to load datetime; instead, if you are already using pandas, create the new column like this:

mondist['shifted_date'] = mondist.date + pd.Timedelta(days=1) 
like image 24
Lucas H Avatar answered Oct 14 '22 15:10

Lucas H