2015-08-31 5 views
2

Я хочу, чтобы найти время, прошедшее между 2 событий А и В. Более конкретно, когда происходит событие А, я хочу знать, сколько времени это займет до следующего совпадения событий В.времени между событиями (панды)

Взгляните на этот пример:

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, но является более сложным, поскольку множество событий а может о ccur перед событием B. Я много думал о правильном решении, но не смог придумать что-то, что делает трюк.

ответ

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 с.

+0

Отлично, спасибо! – Pilik

Смежные вопросы