如何对二级索引为日期的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
相关产品推荐
相关产品推荐

