2013-10-24 152 views
0

我可以在不使用自己的lambda函數的情況下接收由groupby操作產生的羣組的覆蓋時間段嗎?熊貓時間序列中的羣組時間跨度

目前我有下面的解決方案,但我想知道如果熊貓API不是已經有這種內置莫名其妙嗎? 要描述我在數據準備部分所做的工作:我的任務是查明何時布爾標誌爲True,特別是多長時間。我發現ndimage.label-ing是處理非連續數據塊的有效方法。但我願意接受任何其他酷炫的建議!

import pandas as pd 
from scipy.ndimage import label 
# data preparation 
idx = pd.date_range(start='now', periods = 100, freq='min') 
df= pd.DataFrame(randn(100), index=idx, columns=['data']) 
df['mybool'] = df.data > 0 
df['label'] = label(df.mybool)[0] 
# my actual question: 
df.groupby('label').apply(lambda x:x.index[-1] - x.index[0]) 

基本上,我從每個組的第一個減去最後的時間戳。 這導致:

label 
0  01:37:00 
1  00:00:00 
2  00:01:00 
3  00:01:00 
4  00:01:00 
5  00:02:00 
6  00:00:00 
7  00:10:00 
8  00:00:00 
9  00:01:00 
10  00:02:00 
11  00:00:00 
12  00:01:00 
13  00:04:00 
14  00:02:00 
15  00:01:00 
16  00:00:00 
17  00:00:00 
18  00:00:00 
19  00:01:00 
20  00:00:00 
21  00:01:00 
22  00:02:00 
23  00:00:00 
24  00:00:00 
dtype: timedelta64[ns] 

重申一下我的問題:是否大熊貓API提供了一招,做同樣不使用應用lambda函數或者甚至沒有第一分組?

+0

嘗試df.groupby(..)最後() - df.groupby(..)第() – Jeff

+0

但去年()和第()不訪問。索引?它們提供布爾值的值,而不是它的時間戳值。 –

回答

5

嘗試這樣

In [11]: df 
Out[11]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 100 entries, 2013-10-25 00:45:49 to 2013-10-25 02:24:49 
Freq: T 
Data columns (total 3 columns): 
data  100 non-null values 
mybool 100 non-null values 
label  100 non-null values 
dtypes: bool(1), float64(1), int32(1) 

In [12]: df['date'] = df.index 

In [14]: g = df.groupby('label')['date'] 

In [15]: g.last()-g.first() 
Out[15]: 

label 
0  01:39:00 
1  00:03:00 
2  00:00:00 
3  00:04:00 
4  00:02:00 
5  00:00:00 
6  00:01:00 
7  00:02:00 
8  00:08:00 
9  00:00:00 
10  00:00:00 
11  00:06:00 
12  00:07:00 
13  00:00:00 
14  00:00:00 
15  00:04:00 
16  00:00:00 
17  00:01:00 
18  00:00:00 
19  00:01:00 
20  00:00:00 
21  00:00:00 
22  00:00:00 
Name: date, dtype: timedelta64[ns] 
+0

這也有利於透明/明顯發生了什麼。 –

+0

有趣的是,df ['date'] = df.index需要超過100秒,其索引> 1700萬個時間戳。但是'df.index.name ='date'; g = df.reset_index()。groupby('label')['date']'只需要90毫秒! –

+0

該作業是一個性能問題.....感謝報告 – Jeff