Как найти время начала и окончания события в python? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть фрейм данных, состоящий из столбца 1, т.е. события, а столбец 2 - Datetime:

Пример данных

 Event   Time
    0   2020-02-12 11:00:00
    0   2020-02-12 11:30:00
    2   2020-02-12 12:00:00
    1   2020-02-12 12:30:00
    0   2020-02-12 13:00:00
    0   2020-02-12 13:30:00
    0   2020-02-12 14:00:00
    1   2020-02-12 14:30:00
    0   2020-02-12 15:00:00
    0   2020-02-12 15:30:00

И я хочу найти время начала и окончания каждого события :

Требуемые данные

 Event  EventStartTime  EventEndTime
    0   2020-02-12 11:00:00 2020-02-12 12:00:00
    2   2020-02-12 12:00:00 2020-02-12 12:30:00
    1   2020-02-12 12:30:00 2020-02-12 13:00:00
    0   2020-02-12 13:00:00 2020-02-12 14:30:00
    1   2020-02-12 14:30:00 2020-02-12 15:00:00

Примечание. EventEndTime - это время, когда событие меняет значение, скажем, со значения 1 на полученное изменение на 0 или любое другое значение или наоборот

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Предполагая, что фрейм данных равен data:

current_event = None
result = []
for event, time in zip(data['Event'], data['Time']):
    if event != current_event:
        if current_event is not None:
            result.append([current_event, start_time, time])
        current_event, start_time = event, time
data = pandas.DataFrame(result, columns=['Event','EventStartTime','EventEndTime'])

Хитрость заключается в сохранении номера вашего события; если следующий номер события не совпадает с сохраненным, сохраненный должен быть завершен, а новый - запущен.

0 голосов
/ 12 февраля 2020

Вот метод, который может получить результаты без для l oop. Я предполагаю, что входные данные считываются в кадр данных с именем df:

# Initialize the output df
dfout = pd.DataFrame()
dfout['Event'] = df['Event']
dfout['EventStartTime'] = df['Time']

Теперь я создаю переменную с именем 'change', которая сообщает вам, изменилось ли событие.

dfout['change'] = df['Event'].diff()

Вот как теперь выглядит dfout:

   Event       EventStartTime  change
0      0  2020-02-12 11:00:00     NaN
1      0  2020-02-12 11:30:00     0.0
2      2  2020-02-12 12:00:00     2.0
3      1  2020-02-12 12:30:00    -1.0
4      0  2020-02-12 13:00:00    -1.0
5      0  2020-02-12 13:30:00     0.0
6      0  2020-02-12 14:00:00     0.0
7      1  2020-02-12 14:30:00     1.0
8      0  2020-02-12 15:00:00    -1.0
9      0  2020-02-12 15:30:00     0.0

Теперь я go включаю, чтобы удалить строки, в которых событие не изменилось:

dfout = dfout.loc[dfout['change'] !=0 ,:]

Теперь у меня останутся строки где событие изменилось.

Далее время окончания текущего события является временем начала следующего события.

dfout['EventEndTime'] = dfout['EventStartTime'].shift(-1)

Кадр данных выглядит следующим образом:

   Event       EventStartTime  change         EventEndTime
0      0  2020-02-12 11:00:00     NaN  2020-02-12 12:00:00
2      2  2020-02-12 12:00:00     2.0  2020-02-12 12:30:00
3      1  2020-02-12 12:30:00    -1.0  2020-02-12 13:00:00
4      0  2020-02-12 13:00:00    -1.0  2020-02-12 14:30:00
7      1  2020-02-12 14:30:00     1.0  2020-02-12 15:00:00
8      0  2020-02-12 15:00:00    -1.0                  NaN

Вы можете удалить столбец 'change', а также последнюю строку, если она не нужна.

0 голосов
/ 12 февраля 2020

Используйте group by и agg для получения вывода в нужном формате.

df =pd.DataFrame([['0',11],['1',12],['1',13],['0',15],['1',16],['3',11]],columns=['Event','Time'] )
df.groupby(['Event']).agg(['first','last']).rename(columns={'first':'start-event','last':'end-event'})

Вывод:

Event start-event   end-event   
0      11           15
1      12           16
3      11           11
...