2016-10-18 91 views
1

減去天后獲取日期我有一個數據幀:如何大熊貓

In [15]: df 
Out[15]: 
     date day 
0 2015-10-10 23 
1 2015-12-19 9 
2 2016-03-05 34 
3 2016-09-17 23 
4 2016-04-30 2 

我想減去之日起的天數,並創建一個新列。

In [16]: df.dtypes 
Out[16]: 
date datetime64[ns] 
day    int64 

所需的輸出是這樣的:

In [15]: df 
Out[15]: 
     date day date1 
0 2015-10-10 23 2015-09-17 
1 2015-12-19 9 2015-12-10 
2 2016-03-05 34 2016-01-29 
3 2016-09-17 23 2016-08-25 
4 2016-04-30 2 2016-04-28 

我試過,但這個不起作用:

df['date1']=df['date']+pd.Timedelta(df['date'].dt.day-df['day']) 

它拋出錯誤:

TypeError: unsupported type for timedelta days component: Series

回答

4

您可以使用to_timedelta

df['date1'] = df['date'] - pd.to_timedelta(df['day'], unit='d') 

print (df) 
     date day  date1 
0 2015-10-10 23 2015-09-17 
1 2015-12-19 9 2015-12-10 
2 2016-03-05 34 2016-01-31 
3 2016-09-17 23 2016-08-25 
4 2016-04-30 2 2016-04-28 

如果需要Timedelta使用apply,但它是slowier:

df['date1'] = df['date'] - df.day.apply(lambda x: pd.Timedelta(x, unit='D')) 

print (df) 
     date day  date1 
0 2015-10-10 23 2015-09-17 
1 2015-12-19 9 2015-12-10 
2 2016-03-05 34 2016-01-31 
3 2016-09-17 23 2016-08-25 
4 2016-04-30 2 2016-04-28 

計時

#[5000 rows x 2 columns] 
df = pd.concat([df]*1000).reset_index(drop=True) 

In [252]: %timeit df['date'] - df.day.apply(lambda x: pd.Timedelta(x, unit='D')) 
10 loops, best of 3: 45.3 ms per loop 

In [253]: %timeit df['date'] - pd.to_timedelta(df['day'], unit='d') 
1000 loops, best of 3: 1.71 ms per loop 
+0

感謝您將使用我上面使用pd.Timedelta嘗試的方法。 – rey

+0

是的,這是另一種解決方案。 – jezrael

+0

你能糾正我在上面的聲明中使用過嗎? – rey

1
import dateutil.relativedelta 
def calculate diff(v): 
    return v['date'] - dateutil.relativedelta.relativedelta(day=v['day']) 
df['date1']=df.apply(calculate_diff, axis=1) 

因爲v [ '日期']爲datetime對象

+0

它給了我錯誤'KeyError:('date','發生在索引日期')'。 – rey

+0

編輯......... –

+0

感謝它的工作。 – rey