熊猫时间序列中的群体时间跨度

K.-*_*Aye 0 python pandas

我可以在不使用自己的lambda函数的情况下收到groupby操作产生的覆盖时间跨度吗?

目前我有以下解决方案,但我想知道大熊猫API是否已经以某种方式内置这个内置?描述我在数据准备部分正在做什么:我的任务是找出何时,特别是布尔标志为True的时间.我发现ndimage.labeling是处理非连续数据块的有效方法.但我对任何其他很酷的建议持开放态度!

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])
Run Code Online (Sandbox Code Playgroud)

基本上,我从每个组中减去第一个时间戳.这导致:

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]
Run Code Online (Sandbox Code Playgroud)

重申一下我的问题:pandas API是否提供了一种技巧,可以在不使用lambda函数的情况下执行相同的操作,甚至可以先进行分组?

Jef*_*eff 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]
Run Code Online (Sandbox Code Playgroud)