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

如何在Pandas中筛选多组时间区间内的数据行

筛选Pandas DataFrame中落在任意时间区间内的行

嘿,这个问题我之前也碰到过,用Pandas结合NumPy就能轻松解决!下面给你两种可行的方案,按需选择:

第一步:确保时间数据类型正确

首先得保证你的DataFrame里的time列和两个区间数组都是datetime类型,否则比较会出错:

import pandas as pd
import numpy as np

# 转换df的time列为datetime类型(如果还没转的话)
df['time'] = pd.to_datetime(df['time'])

# 补全你提供的upper数组(假设缺失部分是2013-10-19T18:00:00)
lower = np.array(['2013-10-09T06:15:00.000000000', '2013-10-09T07:00:00.000000000', '2013-10-19T13:00:00.000000000'], dtype='datetime64[ns]')
upper = np.array(['2013-10-09T11:15:00.000000000', '2013-10-09T12:00:00.000000000', '2013-10-19T18:00:00.000000000'], dtype='datetime64[ns]')

方案一:Pandas条件拼接(直观易懂)

这个方法用列表推导式生成每个区间的筛选条件,然后合并成一个总条件:

# 生成每个(lower[i], upper[i])对应的布尔条件
interval_conditions = [(df['time'] >= l) & (df['time'] <= u) for l, u in zip(lower, upper)]

# 合并条件:只要满足任意一个区间就保留该行
filtered_df = df[pd.concat(interval_conditions, axis=1).any(axis=1)]

解释:zip(lower, upper)把每个区间的上下限配对,生成的每个条件是一个布尔Series,pd.concat把这些Series拼成DataFrame,any(axis=1)表示每行只要有一个条件为True就保留。

方案二:NumPy广播(高效适合大数据)

如果你的DataFrame数据量很大,用NumPy广播的方法会更快:

# 把df的time转为二维NumPy数组(方便广播)
times = df['time'].to_numpy()[:, np.newaxis]

# 广播比较:检查每个时间是否落在任意一个区间内
mask = ((times >= lower) & (times <= upper)).any(axis=1)

# 筛选结果
filtered_df = df[mask]

解释:times[:, np.newaxis]把一维时间数组变成n行1列的二维数组,和一维的lower/upper广播后,得到n行3列的布尔数组,any(axis=1)取每行的逻辑或结果,作为最终筛选掩码。

最终筛选结果

运行上述代码后,你会得到符合条件的行:

eventtime
breakfast2013-10-09 06:27:00
school2013-10-09 07:25:00
exam2013-10-09 10:25:00
lunch2013-10-09 12:00:00
homework2013-10-09 12:00:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:04:13