2017-03-01 17 views
1

팬더에서는 데이터를 열의 값으로 그룹화 한 다음 각 타임 스탬프와 해당 그룹의 첫 번째 타임 스탬프 간의 시간차를 계산하고 싶습니다.팬더 : groupby와 각 그룹의 첫 번째 요소와의 시간차를 계산하십시오

# Create data. 
d = {'foo': ['001', '001', '002', '002', '002'], 
    'timestamp': ['2015-02-24 19:12:00', '2015-02-24 21:38:00', '2015-02-25 03:41:00', '2015-02-25 03:44:00', '2015-02-25 03:49:00']} 
df = pd.DataFrame(d, columns = ['foo', 'timestamp']) 
df['timestamp'] = pd.DatetimeIndex(pd.to_datetime(df['timestamp'])).tz_localize('UTC') 
>>> print df 
    foo     timestamp 
0 001 2015-02-24 19:12:00+00:00 
1 001 2015-02-24 21:38:00+00:00 
2 002 2015-02-25 03:41:00+00:00 
3 002 2015-02-25 03:44:00+00:00 
4 002 2015-02-25 03:49:00+00:00 

원하는 출력은 다음과 같습니다 :

는 예를 들어, 다음 DataFrame을 고려

foo     timestamp output 
0 001 2015-02-24 19:12:00+00:00  NaT 
1 001 2015-02-24 21:38:00+00:00 02:26:00 
2 002 2015-02-25 03:41:00+00:00  NaT 
3 002 2015-02-25 03:44:00+00:00 00:03:00 
4 002 2015-02-25 03:49:00+00:00 00:08:00 

.diff()의 사용은 원하는 결과를 다음을 얻을 수 있지만.

>>> d.groupby('foo')['timestamp'].diff() 
0  NaT 
1 02:26:00 
2  NaT 
3 00:03:00 
4 00:05:00 

답변

4

사용 assign + apply

df.assign(output=df.groupby('foo').timestamp.apply(lambda x: x - x.iloc[0])) 

    foo     timestamp output 
0 001 2015-02-24 19:12:00+00:00 00:00:00 
1 001 2015-02-24 21:38:00+00:00 02:26:00 
2 002 2015-02-25 03:41:00+00:00 00:00:00 
3 002 2015-02-25 03:44:00+00:00 00:03:00 
4 002 2015-02-25 03:49:00+00:00 00:08:00 
+0

감사합니다! 이상적으로, 각 그룹의'output'의 첫 번째 요소는'00 : 00 : 00'이 아니라'NaN' (또는'NaT')이되고 싶습니다. 그렇게하는 방법을 보여줄 수 있다면, 대답을 받아 들일 것입니다. – Adam

관련 문제