2013-12-09 27 views
15

Tôi cần thêm 1 ngày vào mỗi ngày tôi muốn có ngày bắt đầu của tháng tiếp theo, ví dụ: 2014-01-2014 cho mục đầu tiên trong khung dữ liệu. Cố gắng:Pandas thêm một ngày vào cột

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

nào mang lại cho tôi:

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

Có một 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 

Trả lời

22

Làm cho nó một DatetimeIndex đầu tiên:

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

Lưu ý: Tôi thứ mực có một yêu cầu tính năng này có thể làm việc với các cột ngày ...

Trong hành động:

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

Yup, nó là lạ rằng nó sẽ không làm việc trừ khi nó là một chỉ số .... – dartdog

+1

@dartdog DatetimeIndex là có một số phương pháp cụ thể ngày để chơi với, nhưng một cột doesn' t (chưa). –

+0

xem giải pháp dưới đây để biết cách thực hiện điều này trên cột không được lập chỉ mục ... – dartdog

10

Cố gắng sử dụng timedelta():

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

Nice .. mặc dù giải pháp của @Andy Hayden có tác dụng tốt đối với tôi trong trường hợp này. Bạn nên biết rằng bạn có thể trực tiếp thao tác các ngày trong cột không được lập chỉ mục. – dartdog

+0

Điều này phù hợp nhất với tôi. –

3

Theo như tôi có thể cho biết tshift nhanh hơn một chút so với thực hiện toán học chẳng hạn như + pd.DateOffset v.v. Tất nhiên, nó chỉ áp dụng cho các chỉ số Dòng hoặc Dataframe, không phải cột .. nhưng bạn có thể làm:

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

Nếu df của bạn lớn, điều này có thể làm giảm một nửa thời gian - ít nhất nó đã làm cho tôi, đó là lý do tại sao tôi đang sử dụng nó.

3

Không cần biến thành chỉ mục. Chỉ cần sử dụng .apply() công trình:

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

Dường như tính năng đã được thêm vào cho các cột so với chỉ mục .., cảm ơn bạn đã cập nhật! – dartdog