Pandas时间resample重采样报非唯一索引重索引错误求助
问题根因
触发ValueError: cannot reindex a non-unique index with a method or limit的核心原因有两个:
- 代码存在明显笔误:时间列转换时引用的对象名
dfinal、设置索引时传入的列名tijd均和你定义的DataFrame、时间列名datetime不匹配,直接导致设置后的索引不存在或存在大量重复非唯一值。 - pandas规则限制:
resample后调用的pad()(即向前填充ffill)属于带填充逻辑的重索引操作,这类操作不允许在存在重复值的非唯一索引上执行。
另外你直接调用pad()的逻辑也不符合需求:pad()是对整行做向前填充,无法实现“分散在不同时间点的单列有效值,按15分钟窗口聚合”的目标。
正确实现方案
按以下步骤处理即可解决报错并得到符合预期的重采样结果:
- 修正笔误,将
datetime列正确转为pandas时间类型 - 设置时间列为索引并排序,对可能存在的重复时间索引做去重处理,保证索引唯一
- 按15分钟间隔重采样,对每个窗口内的列取有效值,再补全窗口内无有效值的列即可
可直接运行的参考代码:
import pandas as pd # 时间列类型转换,修正原有笔误 df["datetime"] = pd.to_datetime(df["datetime"]) # 设置时间索引、排序、去重,保证索引唯一 df = df.set_index("datetime").sort_index() df = df[~df.index.duplicated(keep="last")] # 15分钟重采样:窗口左边界作为标签,取窗口内各列第一个非空值,空值向前填充 resampledata = df.resample("15T", label="left").first().ffill()
如果需要取每个时间窗口内最后一个非空值,把代码中first()替换为last()即可。
注:你给出的期望输出中23:15窗口C列值为65,是因为该值落在23:00-23:15窗口的末尾,使用
last()作为聚合函数即可得到该结果,可根据实际业务逻辑选择聚合规则。
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

