2017-03-01 31 views
1

在pandas中,我希望將數據按列中的值分組,然後計算每個時間戳與該組中第一個時間戳之間的時間差。pandas: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 

所需的輸出將是:

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'的第一個元素是'NaN'(或'NaT')而不是'00:00:00'。如果您也可以展示如何做到這一點,我會將答案標記爲已接受。 – Adam

相關問題