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

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

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

 Class Event    Time
0   A   0   2020-02-19 11:00:00
1   A   0   2020-02-19 11:30:00
2   B   1   2020-02-19 11:00:00
3   B   1   2020-02-19 11:30:00
4   B   0   2020-02-19 12:00:00
5   B   0   2020-02-19 12:30:00
6   A   0   2020-02-19 14:00:00
7   B   1   2020-02-19 13:30:00
8   A   1   2020-02-19 15:00:00
9   B   1   2020-02-19 15:30:00
10  A   0   2020-02-19 15:30:00
11  B   0   2020-02-19 16:00:00
12  A   1   2020-02-19 16:30:00

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

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

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

    Class   Event   EventStartTime       EventEndTime
0    A        0    2020-02-19 11:00:00  2020-02-19 15:00:00
1    A        1    2020-02-19 15:00:00  2020-02-10 15:30:00
2    A        0    2020-02-19 15:30:00  2020-02-10 16:30:00
3    B        1    2020-02-19 11:00:00  2020-02-10 12:00:00
4    B        0    2020-02-19 12:00:00  2020-02-19 13:30:00
5    B        1    2020-02-19 13:30:00  2020-02-19 16:00:00

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

1 Ответ

1 голос
/ 19 февраля 2020

Попробуйте:

dfg = df.groupby('Class')
df_new = pd.DataFrame()
for c,d in dfg:
    dfx = d[~(d.Event == d.shift().Event)]
    dfx['EventEndTime'] = d[~(d.Event == d.shift().Event)].shift(-1)['Time']
    dfx = dfx.dropna()
    df_new = pd.concat([df_new, dfx], ignore_index=True)
df_new.columns = ['Class','Event','EventStartTime','EventEndTime']
print(df_new)

  Class  Event      EventStartTime        EventEndTime
0     A      0 2020-02-19 11:00:00 2020-02-19 15:00:00
1     A      1 2020-02-19 15:00:00 2020-02-19 15:30:00
2     A      0 2020-02-19 15:30:00 2020-02-19 16:30:00
3     B      1 2020-02-19 11:00:00 2020-02-19 12:00:00
4     B      0 2020-02-19 12:00:00 2020-02-19 13:30:00
5     B      1 2020-02-19 13:30:00 2020-02-19 16:00:00
...