我想找到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事件。我已经想到了一个合适的解决方案,但没有设法提出一些可行的方法。
答案 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的日期。