You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以Pythonic方式筛选不在任意时间窗口内的事件DataFrame

筛选不在任何时间窗口内的事件DataFrame

问题描述

我有一个包含事件名称和事件时间的事件DataFrame,还有一个包含开始时间和结束时间的时间窗口DataFrame。想要用Pythonic的方式筛选出仅包含不在任何时间窗口内的事件的DataFrame。

示例数据

事件DataFrame

事件名称事件时间
Event102/01/2000 00:00:00
Event205/01/2000 10:00:00
Event307/01/2000 09:00:00
Event410/01/2000 02:00:00

时间窗口DataFrame

时间窗口名称开始时间结束时间
Window101/01/2000 00:00:0006/01/2000 00:00:00
Window210/01/2000 01:00:0010/01/2000 04:00:00

筛选结果

事件名称事件时间
Event307/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:07:06