Вот метод, который может получить результаты без для 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', а также последнюю строку, если она не нужна.