按pandas中的布尔值分组时间范围

时间:2015-09-28 13:31:03

标签: python pandas

我有一个带有布尔值的pandas时间序列:

2014-09-09 08:01:07.617    False
2014-09-09 08:01:08.617    False
2014-09-09 08:01:09.616    False
2014-09-09 08:01:10.616    False
2014-09-09 08:01:11.617     True
2014-09-09 08:01:12.616     True
2014-09-09 08:01:13.616     True
2014-09-09 08:01:14.617     True
2014-09-09 08:01:15.616     True
2014-09-09 08:01:16.616     False
2014-09-09 08:01:17.616     False
2014-09-09 08:01:18.616     False
2014-09-09 08:01:20.116     False
2014-09-09 08:01:21.116     False

我想计算具有相同布尔值的日期范围。 在上面的例子中,它将通过

2014-09-09 08:01:07.617 -- 2014-09-09 08:01:10.616 False
2014-09-09 08:01:11.617 -- 2014-09-09 08:01:15.616 True
2014-09-09 08:01:16.616 -- 2014-09-09 08:01:21.116 False

真实数据在系列中有2e9行。有没有办法做到这一点,而不是迭代系列的值?

1 个答案:

答案 0 :(得分:3)

您可以使用diff/cumsum为布尔值分配组编号。 然后按组编号分组,并使用.agg(['first', 'last'])获取每个组中的第一个和最后一个索引:

import pandas as pd

Timestamp = pd.Timestamp
ts = pd.Series({Timestamp('2014-09-09 08:01:07.617000'): False,
                Timestamp('2014-09-09 08:01:08.617000'): False,
                Timestamp('2014-09-09 08:01:09.616000'): False,
                Timestamp('2014-09-09 08:01:10.616000'): False,
                Timestamp('2014-09-09 08:01:11.617000'): True,
                Timestamp('2014-09-09 08:01:12.616000'): True,
                Timestamp('2014-09-09 08:01:13.616000'): True,
                Timestamp('2014-09-09 08:01:14.617000'): True,
                Timestamp('2014-09-09 08:01:15.616000'): True,
                Timestamp('2014-09-09 08:01:16.616000'): False,
                Timestamp('2014-09-09 08:01:17.616000'): False,
                Timestamp('2014-09-09 08:01:18.616000'): False,
                Timestamp('2014-09-09 08:01:20.116000'): False,
                Timestamp('2014-09-09 08:01:21.116000'): False})

df = ts.reset_index()
df['groupno'] = df[0].diff().cumsum().fillna(0)

result = df.groupby(['groupno'])['index'].agg(['first', 'last'])
print(result)

产量

                          first                    last
groupno                                                
0       2014-09-09 08:01:07.617 2014-09-09 08:01:10.616
1       2014-09-09 08:01:11.617 2014-09-09 08:01:15.616
2       2014-09-09 08:01:16.616 2014-09-09 08:01:21.116