如何以Pythonic方式筛选不在任意时间窗口内的事件DataFrame
筛选不在任何时间窗口内的事件DataFrame
问题描述
我有一个包含事件名称和事件时间的事件DataFrame,还有一个包含开始时间和结束时间的时间窗口DataFrame。想要用Pythonic的方式筛选出仅包含不在任何时间窗口内的事件的DataFrame。
示例数据
事件DataFrame
| 事件名称 | 事件时间 |
|---|---|
| Event1 | 02/01/2000 00:00:00 |
| Event2 | 05/01/2000 10:00:00 |
| Event3 | 07/01/2000 09:00:00 |
| Event4 | 10/01/2000 02:00:00 |
时间窗口DataFrame
| 时间窗口名称 | 开始时间 | 结束时间 |
|---|---|---|
| Window1 | 01/01/2000 00:00:00 | 06/01/2000 00:00:00 |
| Window2 | 10/01/2000 01:00:00 | 10/01/2000 04:00:00 |
筛选结果
| 事件名称 | 事件时间 |
|---|---|
| Event3 | 07/01/2000 09:00:00 |
初始化代码
import pandas as pd events_data = { 'Event Name': ['Event1', 'Event2', 'Event3', 'Event4'], 'Event Time': ['02/01/2000 00:00:00', '05/01/2000 10:00:00', '07/01/2000 09:00:00', '10/01/2000 02:00:00'] } time_windows_data = { 'Time Window Name': ['Window1', 'Window2'], 'Start Time': ['01/01/2000 00:00:00', '10/01/2000 01:00:00'], 'End Time': ['06/01/2000 00:00:00', '10/01/2000 04:00:00'] } events_df = pd.DataFrame(events_data) time_windows_df = pd.DataFrame(time_windows_data) events_df['Event Time'] = pd.to_datetime(events_df['Event Time'], format='%d/%m/%Y %H:%M:%S') time_windows_df['Start Time'] = pd.to_datetime(time_windows_df['Start Time'], format='%d/%m/%Y %H:%M:%S') time_windows_df['End Time'] = pd.to_datetime(time_windows_df['End Time'], format='%d/%m/%Y %H:%M:%S')
Pythonic解决方案
实现思路
利用Pandas结合Numpy的广播特性,批量对比每个事件时间与所有时间窗口的范围,判断事件是否属于任意窗口,最终筛选出不在窗口内的事件——这种方式无需循环,高效且符合Python简洁风格。
代码实现
# 批量判断每个事件是否在任意时间窗口内 is_in_any_window = ( # 事件时间 >= 窗口开始时间(广播为n行m列的布尔矩阵) (events_df['Event Time'].values[:, None] >= time_windows_df['Start Time'].values) & # 事件时间 <= 窗口结束时间 (events_df['Event Time'].values[:, None] <= time_windows_df['End Time'].values) ).any(axis=1) # 按行判断是否存在至少一个窗口包含该事件 # 取反筛选出不在任何窗口内的事件 filtered_events = events_df[~is_in_any_window] # 输出结果 print(filtered_events)
运行结果
Event Name Event Time 2 Event3 2000-01-07 09:00:00
内容的提问来源于stack exchange,提问作者Yakir Shlezinger
相关产品推荐
相关产品推荐

