计算事件与熊猫之间的持续时间

时间:2018-08-09 12:55:52

标签: python pandas diff

我有一个数据框

df = pd.DataFrame([['2018-07-02', 'B'],
 ['2018-07-03', 'A'],
 ['2018-07-06', 'B'],
 ['2018-07-08', 'B'],
 ['2018-07-09', 'A'],
 ['2018-07-09', 'A'],
 ['2018-07-10', 'A'],
 ['2018-07-12', 'B'],
 ['2018-07-15', 'A'],
 ['2018-07-16', 'A'],
 ['2018-07-18', 'B'],
 ['2018-07-22', 'A'],
 ['2018-07-25', 'B'],
 ['2018-07-25', 'B'],
 ['2018-07-27', 'A'],
 ['2018-07-28', 'A']], columns = ['DateEvent','Event'])

其中的计数从事件A开始,到事件B结束。某些事件可能在一天以上开始,而在一天以上结束。

我已经计算出差值:

df = df.set_index('DateEvent')
begin = df.loc[df['Event'] == 'A'].index
cutoffs = df.loc[df['Event'] == 'B'].index

idx = cutoffs.searchsorted(begin)
mask = idx < len(cutoffs)
idx = idx[mask]
begin = begin[mask]
end = cutoffs[idx]

pd.DataFrame({'begin':begin, 'end':end})

但是我在多个起点和终点也得到了不同:

begin         end
0  2018-07-03  2018-07-06
1  2018-07-09  2018-07-12
2  2018-07-09  2018-07-12
3  2018-07-10  2018-07-12
4  2018-07-15  2018-07-18
5  2018-07-16  2018-07-18
6  2018-07-22  2018-07-25

所需的输出包括事件A的第一次出现和事件B的最后一次出现...寻找最大持续时间,只是为了确定。

我可以在删除不必要的事件之前或之后循环,但是有没有更好,更Python化的方式?

谢谢

Aleš

1 个答案:

答案 0 :(得分:2)

让我们尝试一下:

df = pd.DataFrame([['2018-07-02', 'B'],
 ['2018-07-03', 'A'],
 ['2018-07-06', 'B'],
 ['2018-07-08', 'B'],
 ['2018-07-09', 'A'],
 ['2018-07-09', 'A'],
 ['2018-07-10', 'A'],
 ['2018-07-12', 'B'],
 ['2018-07-15', 'A'],
 ['2018-07-16', 'A'],
 ['2018-07-18', 'B'],
 ['2018-07-22', 'A'],
 ['2018-07-25', 'B'],
 ['2018-07-25', 'B'],
 ['2018-07-27', 'A'],
 ['2018-07-28', 'A']], columns = ['DateEvent','Event'])

a = (df['Event'] != 'A').cumsum()
a = a.groupby(a).cumcount()
df['Event Group'] = (a == 1).cumsum()

df_out = df.groupby('Event Group').filter(lambda x: set(x['Event']) == set(['A','B']))\
           .groupby('Event Group')['DateEvent'].agg(['first','last'])\
           .rename(columns={'first':'start','last':'end'})\
           .reset_index()

print(df_out)

输出:

   Event Group       start         end
0            1  2018-07-03  2018-07-08
1            2  2018-07-09  2018-07-12
2            3  2018-07-15  2018-07-18
3            4  2018-07-22  2018-07-25

编辑

a = (df['Event'] != 'A').cumsum().mask(df['Event'] != 'A')
df['Event Group'] = a.ffill()
df_out = df.groupby('Event Group').filter(lambda x: set(x['Event']) == set(['A','B']))\
           .groupby('Event Group')['DateEvent'].agg(['first','last'])\
           .rename(columns={'first':'start','last':'end'})\
           .reset_index()