2013-12-09 201 views
15

我需要爲每個日期添加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 

回答

22

使它成爲一個DatetimeIndex第一:

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

注:第I次墨存在,這可能與日期列工作功能的請求......

在行動:

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 
+0

是啊,很奇怪,它不會工作,除非它是一個索引.... – dartdog

+1

@dartdog DatetimeIndex是有幾個日期的具體方法一起玩,但一列沒有按」 t(還)。 –

+0

請參閱下面的解決方案,瞭解如何在非索引列上執行此操作... – dartdog

10

嘗試使用timedelta():

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

不錯..儘管在這種情況下@Andy Hayden的解決方案對我來說工作正常。很高興知道您可以直接操縱非索引列中的日期。 – dartdog

+0

這對我來說最合適。 –

3

至於我能告訴tshift比做數學如+ pd.DateOffset等要快一些。當然,它只適用於Series或Dataframe索引,而不是列......但你可以這樣做:

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

如果你的df很大,這可能會削減一半的時間 - 至少它爲我做了,這就是我使用它的原因。

3

無需轉爲索引。剛開始使用.apply()作品:

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

似乎該功能已添加爲列VS索引..,感謝您的更新! – dartdog