You need to enable JavaScript to run this app. 如何对二级索引为日期的Pandas多级DataFrame做日期区间切片过滤
优惠活动
大模型
产品
解决方案
定价
更多

如何对二级索引为日期的Pandas多级DataFrame做日期区间切片过滤

Pandas 第二层级为日期的多级索引日期范围筛选

针对生成的以persons为第一层级、dates为第二层级的多级索引DataFrame,无需手动拆分索引层级,可通过内置的索引切片或布尔掩码快速完成所有指定的筛选需求,筛选结果会完整保留原有的多级索引结构。

前置准备

使用多级索引切片的简化写法前,先实例化IndexSlice工具,避免冗长的元组写法:

idx = pd.IndexSlice

各筛选需求的实现代码

  • 筛选所有日期落在2016年范围内的行
    直接利用pandas datetime索引的粒度匹配特性,无需写完整时间范围:

    df_2016 = df.loc[idx[:, '2016'], :]
    # 等价的完整写法
    df_2016 = df.loc[idx[:, '2016-01-01':'2016-12-31'], :]
    
  • 筛选所有日期落在2015年至2017年区间内的行
    直接传年份字符串指定切片的起止范围:

    df_2015_to_2017 = df.loc[idx[:, '2015':'2017'], :]
    
  • 筛选所有日期不早于2016年2月1日的行
    切片时仅指定起始日期,结束位置留空即可覆盖后续所有时间点:

    df_after_20160201 = df.loc[idx[:, '2016-02-01':], :]
    
  • 筛选所有日期不早于2018年1月1日的行
    筛选结果结构和示例完全一致,会保留所有person下的符合日期要求的行:

    df_after_20180101 = df.loc[idx[:, '2018-01-01':], :]
    

方法说明与注意事项

  • 上述索引切片写法执行效率更高,适配大数据量筛选,但要求多级索引是预先按层级排序的。示例中通过MultiIndex.from_product生成的索引本身已经完成排序,可直接使用;如果是自行拼接生成的未排序索引,需要先执行df = df.sort_index()再做切片,否则会触发索引排序校验的报错。
  • 如果不想处理索引排序的问题,可以采用基于索引值提取的布尔掩码法,这种写法不受索引排序状态影响,灵活度更高。以筛选2018年1月1日及之后的行为例,写法为:
    # 提取第二层级的日期索引值,生成比较掩码
    date_condition = df.index.get_level_values('dates') >= '2018-01-01'
    df_after_20180101 = df[date_condition]
    
    其他筛选需求只需修改掩码的比较逻辑即可实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 09:15:04