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

如何在Pandas query中扩展时间范围并筛选数据?

扩展时间区间后筛选重叠行的解决方案

问题背景

现有如下结构的DataFrame:

start_time_1    end_time_1    start_time_2    end_time_2
1 
2  

原本使用df.query()筛选两个时间区间重叠的行,代码可正常运行:

df.query(
    "(start_time_1 <= start_time_2 <= end_time_1) or "
    "(start_time_2 <= start_time_1 <= end_time_2)"
)

但尝试将两个时间范围各扩展10秒后,以下代码无法运行:

df.query(
    "(start_time_1-timedelta(seconds=10) <= start_time_2 <= end_time_1+timedelta(seconds=10)) or "
    "(start_time_2-timedelta(seconds=10) <= start_time_1 <= end_time_2+timedelta(seconds=10))"
)

解决方案

df.query()的字符串表达式无法直接调用timedelta,可以用两种方法解决:

方法1:提前计算扩展后的时间列

先在DataFrame中新增扩展后的时间列,再用query筛选:

import pandas as pd
from datetime import timedelta

# 新增扩展后的时间列
df['start_time_1_ext'] = df['start_time_1'] - timedelta(seconds=10)
df['end_time_1_ext'] = df['end_time_1'] + timedelta(seconds=10)
df['start_time_2_ext'] = df['start_time_2'] - timedelta(seconds=10)
df['end_time_2_ext'] = df['end_time_2'] + timedelta(seconds=10)

# 用新列执行筛选
result = df.query(
    "(start_time_1_ext <= start_time_2 <= end_time_1_ext) or "
    "(start_time_2_ext <= start_time_1 <= end_time_2_ext)"
)

# 可选:删除临时新增的列
result = result.drop(['start_time_1_ext', 'end_time_1_ext', 'start_time_2_ext', 'end_time_2_ext'], axis=1)

方法2:直接使用布尔索引

跳过query的字符串解析,直接在布尔条件中计算时间偏移:

import pandas as pd
from datetime import timedelta

# 构造布尔筛选条件
mask = (
    (df['start_time_1'] - timedelta(seconds=10) <= df['start_time_2']) & (df['start_time_2'] <= df['end_time_1'] + timedelta(seconds=10))
) | (
    (df['start_time_2'] - timedelta(seconds=10) <= df['start_time_1']) & (df['start_time_1'] <= df['end_time_2'] + timedelta(seconds=10))
)

result = df[mask]

补充说明

df.query()的表达式上下文默认不包含datetime.timedelta这类外部对象,直接在字符串中调用会触发解析错误。提前计算列或直接使用布尔索引都是更稳妥的方案,后者还省去了临时列的创建步骤。


内容的提问来源于stack exchange,提问作者john22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:07