我需要在每个日期添加1天,以便获得下个月的开始日期,例如2014-01-2014,以获取数据框中的第1项。 试过:
montdist['date'] + pd.DateOffset(1)
这给了我:
TypeError: cannot use a non-absolute DateOffset in datetime/timedelta operations [<DateOffset>]
拥有数据框:
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
答案 0 :(得分:37)
首先使它成为DatetimeIndex:
pd.DatetimeIndex(montdist['date']) + pd.DateOffset(1)
注意:我认为有一项功能请求可以使用日期列...
行动中:
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
答案 1 :(得分:17)
尝试使用timedelta():
mondist['shifted_date']=mondist.date + datetime.timedelta(days=1)
答案 2 :(得分:9)
我认为最简单的方法是szu的回答的变体。 Pandas在其功能中内置了几乎完整的支持日期时间,因此无需加载日期时间。相反,如果您已经在使用熊猫,请像这样创建新列:
mondist['shifted_date'] = mondist.date + pd.Timedelta(days=1)
答案 3 :(得分:4)
无需变成索引。只需使用.apply()
即可:
df['newdate'] = pd.to_datetime(df['date']).apply(pd.DateOffset(1))
答案 4 :(得分:3)
据我所知tshift
比+ pd.DateOffset
等数学要快一些。当然它只适用于系列或数据帧索引,而不是列...但你可以这样做:
df['newdate'] = pd.Series(index=df.index).tshift(periods=1, freq='D').index
如果你的df很大,这可能会减少一半的时间 - 至少它对我有用,这就是我使用它的原因。
答案 5 :(得分:3)
快速提及。如果您使用的是数据帧,并且您的数据类型为datetime64[ns]
未索引,那么我将执行以下操作:
假设日期列名称为“ Date to Change by 1”,而您想将所有日期都更改为1天。
import time
from datetime import datetime, timedelta, date, time
before
['Date to Change by 1'] = 1/31/2020
df['Date to Change by 1'] = (pd.to_datetime(df['Date to Change by 1']) +
timedelta(1)
After
['Date to Change by 1'] = 2/01/2020