事件间隔时间(熊猫)

Pil*_*lik 3 python time-series pandas

我想找到两个事件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
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

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

我的问题与相关,但更为复杂,因为在B事件之前可能会发生多个A事件。我已经对适当的解决方案进行了很多思考,但是还没有想出能够解决问题的方法。

unu*_*tbu 5

您可以使用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})
Run Code Online (Sandbox Code Playgroud)

产量

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

DatetimeIndex.searchsorted方法 没有大量文献记载,但它主要numpy.searchsorted的调用的瘦包装,该包装 可以处理表示为numpy datetime64的日期。