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

如何在多层索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:20:43