팬더

2016-10-18 11 views
1

에서 일을 뺀 날짜를 얻기 위해 어떻게이 dataframe 있습니다팬더

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의 [ '날짜'] 날짜 객체가 주어진

+0

그것은'KeyError : ('날짜', '색인 날짜에 발생했습니다') 오류를 제공합니다. – rey

+0

편집 됨 ......... –

+0

고마워. – rey