熊猫的专栏增加了一天

我需要添加1天到每个日期,我想得到下个月的开始日期,例如2014-01-2014的第一项目在数据框。 试过:

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
117016 次浏览

首先把它设为日期时间索引:

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

尝试使用 timedelta () :

mondist['shifted_date']=mondist.date + datetime.timedelta(days=1)

据我所知,tshift比做数学比如 + pd.DateOffset等要快一点。当然,它只适用于 Series 或 Dataframe 索引,而不适用于列。.但你可以这么做:

df['newdate'] = pd.Series(index=df.index).tshift(periods=1, freq='D').index

如果你的 df 很大,这可能会减少一半的时间-至少对我来说是这样,这就是为什么我要使用它。

不需要变成索引,只要使用 .apply()就可以了:

df['newdate'] = pd.to_datetime(df['date']).apply(pd.DateOffset(1))

我认为最干净的方法是 Szu 的回答的变体。熊猫的功能几乎完全支持 datetime,所以不需要加载 datetime; 相反,如果你已经在使用熊猫,创建这样的新列:

mondist['shifted_date'] = mondist.date + pd.Timedelta(days=1)

提一下。如果你使用的是数据框架,而你的数据类型是 datetime64[ns]非索引,那么我会这样做: 假设日期列名称为“ Date to Change by 1”,并且希望将所有日期更改为1 day。

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