如何在多层索引DataFrame中将日期索引整体偏移1小时?
问题:多层索引DataFrame日期索引批量偏移1小时报错解决
原始多层索引DataFrame:
price symbol date AAPL 2022-10-07 23:57:00 137.17 2022-10-07 23:58:00 137.16 2022-10-08 00:00:00 137.17 MSFT 2022-10-07 23:57:00 200.54 2022-10-07 23:58:00 200.75 2022-10-08 00:00:00 200.62
需求:将位于level 1的日期索引(类型为Index)整体偏移1小时,最终日期变为:
2022-10-07 22:57:00 2022-10-07 22:58:00 2022-10-07 23:00:00
尝试代码:
df.index = df.index.set_levels( df.index.get_level_values("date") - pd.Timedelta("1 hour"), level="date")
报错信息:
ValueError: Level values must be unique:
报错原因
set_levels方法的作用是替换索引层级的唯一值集合,而非逐个修改每个索引条目。你传入的是所有索引条目的日期偏移结果(包含大量重复值),但索引层级要求值必须唯一,因此触发报错。
三种可行解决方案
方案1:用map遍历修改每个索引元组
直接遍历MultiIndex的每个元组,修改日期部分后重建索引:
import pandas as pd df.index = df.index.map(lambda idx: (idx[0], idx[1] - pd.Timedelta("1 hour")))
方案2:拆分索引后重组MultiIndex
提取两个层级的值,修改日期层级后重新构造MultiIndex:
symbols = df.index.get_level_values("symbol") dates = df.index.get_level_values("date") - pd.Timedelta("1 hour") df.index = pd.MultiIndex.from_arrays( [symbols, dates], names=df.index.names )
方案3:正确使用set_levels方法
先提取日期层级的唯一值,偏移后再替换层级集合:
unique_dates = df.index.get_level_values("date").unique() df.index = df.index.set_levels( unique_dates - pd.Timedelta("1 hour"), level="date" )
这三种方法都能实现日期索引整体偏移1小时的需求,且不会触发唯一性报错。
内容的提问来源于stack exchange,提问作者alexx0186
相关产品推荐
相关产品推荐

