如何在python中查找事件的开始时间和结束时间?

如何在python中查找事件的开始时间和结束时间?,python,pandas,python-requests,data-science,data-analysis,Python,Pandas,Python Requests,Data Science,Data Analysis,我的数据框由第1列(即事件)和第2列(即日期时间)组成: 样本数据 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

我的数据框由第1列(即事件)和第2列(即日期时间)组成:

样本数据

 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更改为get change到0或任何其他值的时间,反之亦然使用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

假设数据帧是
数据

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'])

诀窍是保存您的活动编号;如果下一个事件编号与保存的事件编号不同,则必须结束保存的事件编号并启动新的事件编号。

以下是一种无需for循环即可获得结果的方法。我假设输入数据被读入名为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
现在,我继续删除事件未更改的行:

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

如果不需要,您可以选择删除“更改”列和最后一行。

粘贴问题中的数据,不链接图像如何区分开始和结束?相同数量的事件是否保证不会重叠?@Błotosmętek start是事件第一次开始的时间,而end time是事件值更改为其他值的时间。检查数据和所需输出的图像data@luigigi你的例子对我来说毫无意义。例如,为什么
212020-02-12**13:00:00**2020-02-12 13:00:00
如果
312020-02-12**12:30:00**
?输出与op预期的不一样。这不是期望的输出。嘿,如果我想先按某个类别分组,然后通过该循环进行排序,那么我该怎么办@Błotosmętek