首页 > 解决方案 > 如何在python中找到事件的开始时间和结束时间?

问题描述

我有一个数据框由第 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 更改为更改为 0 或任何其他值的时间,反之亦然

标签: pythonpandaspython-requestsdata-sciencedata-analysis

解决方案


这是一种无需 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

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


推荐阅读