如何利用Series的Datetime Index修改另一Series?KeyError报错排查
解决Datetime Index Series按日最小值索引修改另一Series的KeyError问题
我有两个带Datetime Index的Series,目标是在第二个Series每日最小值对应的索引位置,给第一个Series的浮点数值加1。执行以下代码时触发了KeyError:
ser_1.loc[ser_2.groupby(ser_2.index.day_of_year).idxmin()] += 1
报错信息:
raise KeyError(f"None of [{key}] are in the [{axis_name}]")
两个Series的结构如下:
ser_1(全年小时级数据):
2019-01-01 00:00:00 0.04980 2019-01-01 01:00:00 0.04426 2019-01-01 02:00:00 0.05100 2019-01-01 03:00:00 0.04627 2019-01-01 04:00:00 0.03978 ... 2019-12-31 19:00:00 0.04773 2019-12-31 20:00:00 0.04600 2019-12-31 21:00:00 0.04220 2019-12-31 22:00:00 0.03974 2019-12-31 23:00:00 0.03888 Name: 0, Length: 8760, dtype: float64
ser_2(部分日期小时级数据):
2019-01-01 23:00:00 0.000 2019-01-02 00:00:00 0.000 2019-01-02 01:00:00 0.000 2019-01-02 02:00:00 0.000 2019-01-02 03:00:00 0.000 ... 2019-12-13 06:00:00 1.534 2019-12-13 07:00:00 2.425 2019-12-13 08:00:00 1.622 2019-12-13 09:00:00 1.974 2019-12-13 10:00:00 1.729 Freq: H, Name: 1, Length: 8292, dtype: float64
问题原因
这个报错是索引匹配逻辑误解+函数使用细节共同导致的:
ser_2.groupby(ser_2.index.day_of_year).idxmin()返回的是一个特殊Series:它的索引是「年中第几天」的整数,值才是我们需要的、对应每日最小值的datetime索引。直接将这个Series传入ser_1.loc[]时,pandas会误把Series的整数索引当作匹配键,而非我们目标的datetime值,自然找不到对应索引,抛出KeyError。- ser_2的时间范围小于ser_1,但这不是直接报错原因,只是需要后续确保分组得到的datetime索引确实存在于ser_1中。
解决方案
提取idxmin()返回的datetime值作为索引,避免pandas的逻辑误解:
方法1:转为列表后匹配
# 获取每日最小值对应的datetime索引列表 min_indices = ser_2.groupby(ser_2.index.day_of_year).idxmin().tolist() # 可选:过滤掉ser_1中不存在的索引(避免潜在问题) valid_indices = [idx for idx in min_indices if idx in ser_1.index] # 修改ser_1对应位置的值 ser_1.loc[valid_indices] += 1
方法2:直接提取Series的values
更简洁的写法,直接获取datetime值数组:
ser_1.loc[ser_2.groupby(ser_2.index.day_of_year).idxmin().values] += 1
方法3:按日期分组更直观
用normalize()将时间索引转为纯日期(YYYY-MM-DD)分组,可读性更强:
min_indices = ser_2.groupby(ser_2.index.normalize()).idxmin().tolist() ser_1.loc[min_indices] += 1
内容的提问来源于stack exchange,提问作者Hurrdof
相关产品推荐
相关产品推荐

