如何在Pandas中按多组日期间隔筛选时间序列DataFrame行
Pandas 多组时间区间批量筛选方案
以下两种方案可实现需求,可根据区间数量选择适配的实现方式:
前置预处理
首先统一时间列数据类型,避免格式不匹配导致筛选失效:
import pandas as pd # 转换主数据索引为datetime类型(如已为datetime可跳过) df_power.index = pd.to_datetime(df_power.index) # 转换区间表的起止时间列为datetime类型 df_intervals['date start'] = pd.to_datetime(df_intervals['date start']) df_intervals['date end'] = pd.to_datetime(df_intervals['date end'])
方案1:循环生成条件(适合区间量较少的场景)
逻辑简单易懂,区间量在1000以内时性能足够:
# 初始化全为False的掩码 mask = pd.Series(False, index=df_power.index) # 遍历每个区间,合并符合条件的行 for _, interval in df_intervals.iterrows(): mask |= df_power.index.to_series().between(interval['date start'], interval['date end']) # 筛选得到结果 result = df_power[mask]
方案2:区间索引向量化匹配(适合区间量较大的场景)
用pandas原生区间索引实现向量化判断,区间过万也能保持高性能:
# 构建闭区间索引,同时匹配起止时间端点 interval_idx = pd.IntervalIndex.from_arrays( df_intervals['date start'], df_intervals['date end'], closed='both' ) # 判断每个时间点是否落在任意区间内 mask = interval_idx.get_indexer(df_power.index) >= 0 # 筛选得到结果 result = df_power[mask]
注意:如果时间数据带时区,需要保证所有时间列的时区一致,避免出现匹配错误
内容的提问来源于stack exchange,提问作者thelaw
相关产品推荐
相关产品推荐

