事件之间的时间(大熊猫)

时间:2015-08-31 20:47:53

标签: python pandas time-series

我想找到2个事件A和B之间经过的时间。更具体地说,每当事件A发生时,我想知道事件B下一次出现之前需要多长时间。

看一下这个例子:

import pandas as pd
import numpy as np

np.random.seed(5)
strings=list('AB')
data=[strings[i] for i in np.random.randint(0,2,15)]
index=pd.date_range('2/2/2012',periods=15,freq='T')
dfm=pd.DataFrame(data={'event':data},index=index)
dfm

                  event
2012-02-02 00:00:00 B
2012-02-02 00:01:00 A
2012-02-02 00:02:00 B
2012-02-02 00:03:00 B
2012-02-02 00:04:00 A
2012-02-02 00:05:00 A
2012-02-02 00:06:00 A
2012-02-02 00:07:00 B
2012-02-02 00:08:00 A
2012-02-02 00:09:00 A
2012-02-02 00:10:00 B
2012-02-02 00:11:00 A
2012-02-02 00:12:00 B
2012-02-02 00:13:00 A
2012-02-02 00:14:00 A

我的预期输出是:

begin           end
2012-02-02 00:01:00 2012-02-02 00:02:00 
2012-02-02 00:04:00 2012-02-02 00:07:00
2012-02-02 00:05:00 2012-02-02 00:07:00
2012-02-02 00:06:00 2012-02-02 00:07:00
2012-02-02 00:08:00 2012-02-02 00:10:00
2012-02-02 00:09:00 2012-02-02 00:10:00
2012-02-02 00:11:00 2012-02-02 00:12:00

我的问题与this one有关但更复杂,因为在B事件之前可能发生多个A事件。我已经想到了一个合适的解决方案,但没有设法提出一些可行的方法。

1 个答案:

答案 0 :(得分:4)

您可以使用searchsorted查找将开始日期插入到结束日期数组中的索引 同时按排序顺序保留结束日期。这一系列索引告诉您与每个开始日期关联的结束日期。

import pandas as pd
import numpy as np

np.random.seed(5)
strings = list('AB')
data = [strings[i] for i in np.random.randint(0, 2, 15)]
index = pd.date_range('2/2/2012', periods=15, freq='T')
dfm = pd.DataFrame(data={'event': data}, index=index)


begin = dfm.loc[dfm['event'] == 'A'].index
cutoffs = dfm.loc[dfm['event'] == 'B'].index

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

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

产量

                begin                 end
0 2012-02-02 00:01:00 2012-02-02 00:02:00
1 2012-02-02 00:04:00 2012-02-02 00:07:00
2 2012-02-02 00:05:00 2012-02-02 00:07:00
3 2012-02-02 00:06:00 2012-02-02 00:07:00
4 2012-02-02 00:08:00 2012-02-02 00:10:00
5 2012-02-02 00:09:00 2012-02-02 00:10:00
6 2012-02-02 00:11:00 2012-02-02 00:12:00

DatetimeIndex.searchsorted method 没有大量记录,但主要是a thin wrapper呼叫numpy.searchsorted 它可以处理表示为numpy datetime64 s的日期。