在Pandas中如何基于现有MultiIndex创建新的索引层级?
实现步骤
我们可以通过提取原datetime层级、做分钟舍入后追加为新索引层级的方式实现,以下是完整可运行的代码示例:
1. 构造测试用MultiIndex(已有索引的可以跳过这一步)
import pandas as pd # 示例:构造由datetime、行号组成的双层MultiIndex dt_level = pd.date_range("2024-05-20 09:02:15", periods=6, freq="22s") row_level = [1,2,3,4,5,6] original_midx = pd.MultiIndex.from_arrays( [dt_level, row_level], names=["raw_datetime", "row_number"] )
2. 核心操作:舍入datetime并追加新层级
# 提取datetime层级,舍入到最近分钟 rounded_min = original_midx.get_level_values("raw_datetime").round("min") # 方法1:直接在原索引基础上追加新层级,新层级默认排在最后 new_midx = original_midx.append_levels([rounded_min], names=["rounded_minute"]) # 方法2:如果需要自定义层级顺序,可以直接重新构造MultiIndex new_midx = pd.MultiIndex.from_arrays( [rounded_min, original_midx.get_level_values("raw_datetime"), original_midx.get_level_values("row_number")], names=["rounded_minute", "raw_datetime", "row_number"] )
3. 结果验证
执行print(new_midx)可以看到新的索引结构如下,已经成功新增了舍入后的分钟层级:
MultiIndex([('2024-05-20 09:02:00', '2024-05-20 09:02:15', 1), ('2024-05-20 09:02:00', '2024-05-20 09:02:37', 2), ('2024-05-20 09:03:00', '2024-05-20 09:02:59', 3), ('2024-05-20 09:03:00', '2024-05-20 09:03:21', 4), ('2024-05-20 09:03:00', '2024-05-20 09:03:43', 5), ('2024-05-20 09:04:00', '2024-05-20 09:04:05', 6)], names=['rounded_minute', 'raw_datetime', 'row_number'])
注意事项
- pandas 1.3.0及以上版本原生支持datetime的
round("min")语法,低版本用户可以先升级pandas,或者用pd.to_datetime((dt_level.astype('int64') // 60e9 ) * 60e9)实现等价的分钟舍入逻辑。
内容的提问来源于stack exchange,提问作者Jonny Shanahan
相关产品推荐
相关产品推荐

