如何在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)取每行的逻辑或结果,作为最终筛选掩码。
最终筛选结果
运行上述代码后,你会得到符合条件的行:
| event | time |
|---|---|
| breakfast | 2013-10-09 06:27:00 |
| school | 2013-10-09 07:25:00 |
| exam | 2013-10-09 10:25:00 |
| lunch | 2013-10-09 12:00:00 |
| homework | 2013-10-09 12:00:00 |
内容的提问来源于stack exchange,提问作者LogCapy
相关产品推荐
相关产品推荐

