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

Posted

技术标签:

【中文标题】如何在python中找到事件的开始时间和结束时间?【英文标题】:How to find the start time and end time of an event in python? 【发布时间】:2020-05-27 21:30:53 【问题描述】:

我有一个数据框包含第 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 或任何其他值,反之亦然

【问题讨论】:

在你的问题中粘贴数据,不要链接图片 如何区分开始和结束?相同数量的事件是否保证不重叠? @Błotosmętek 开始是事件第一次开始的时间和事件值更改为其他值的结束时间。检查数据的图像和所需的输出数据 @luigigi 已粘贴 你的例子对我来说毫无意义。例如,如果3 1 2020-02-12 **12:30:00**,为什么要2 1 2020-02-12 **13:00:00** 2020-02-12 13:00:00 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

假设数据框是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'])

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

【讨论】:

嘿,如果我想先按某个类别分组,然后遍历该循环,那么我想做什么? @Błotosmętek【参考方案3】:

使用 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

【讨论】:

输出与操作预期的不同。 这不是想要的输出。

以上是关于如何在python中找到事件的开始时间和结束时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中确定视频的开始时间和结束时间(自纪元以来的秒数)?

在事件日志中获取特定任务的开始结束时间

给定具有开始和结束时间的事件,如何使用 Spark 计算同时发生的事件数?

使用fullCalendar将allDay设置为false时,如何动态设置事件开始和结束时间?

从开始日期和结束日期开始,我如何找到当前“活动”的记录?

Html 视频结束事件不适用于元素中的开始和结束时间声明