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

如何高效过滤Pandas数据框:排除另一数据框日期区间内的行

百万级数据高效处理方案:排除指定Code日期区间内的行

核心思路

放弃apply逐行循环,改用Pandas向量化操作+合并匹配,依托底层优化的C实现提升性能,彻底规避逐行遍历的低效问题。

步骤与代码实现

  1. 统一日期类型
    先确保所有日期列都是datetime类型,否则无法进行有效比较:
import pandas as pd

# 转换df_table的时间戳列
df_table['Timestamp'] = pd.to_datetime(df_table['Timestamp'])
# 转换df_dates的区间列(假设列名为start_date、end_date)
df_dates[['start_date', 'end_date']] = df_dates[['start_date', 'end_date']].apply(pd.to_datetime)
  1. 合并匹配日期区间
    通过merge按Code左连接两个DataFrame,让每条业务数据都带上对应Code的所有日期区间:
df_merged = df_table.merge(df_dates, on='Code', how='left')
  1. 标记需排除的行
    用向量化条件判断,标记出Timestamp落在任意对应区间内的行:
df_merged['is_excluded'] = (df_merged['Timestamp'] >= df_merged['start_date']) & (df_merged['Timestamp'] <= df_merged['end_date'])
  1. 筛选保留目标行
    由于同一个Code可能对应多个区间,只要有一个区间命中就需要排除该行。通过groupby按原表索引聚合,取any判断是否命中,最后取反筛选:
# 保留未被标记为排除的行
df_result = df_table[~df_merged.groupby(df_table.index)['is_excluded'].any()]

额外性能优化建议

  • 提前对两个DataFrame按Code排序,能大幅提升merge操作的速度:
    df_table = df_table.sort_values('Code').reset_index(drop=True)
    df_dates = df_dates.sort_values('Code').reset_index(drop=True)
    
  • 若df_dates中存在重复Code的区间,可先对其按Code去重合并(比如合并重叠区间),进一步减少merge后的数据量,提升后续操作效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:14:59