Pandas重采样后使用loc按季度索引出现异常问题咨询
这是预期行为,不是Pandas Bug
核心原因
- 原始DataFrame的datetime索引使用
loc["2014-Q1"]能正常匹配,是因为Pandas支持对连续datetime索引做「部分时间范围匹配」——它会自动将"2014-Q1"解析为2014年1-3月的时间区间,返回该区间内的所有行。 - 但执行
resample("QS").sum()后,生成的是离散的季度起始日Timestamp索引(比如2014-01-01对应2014年Q1,2014-04-01对应Q2,以此类推)。此时用loc["2014-Q1"]匹配时,Pandas会将该字符串解析为季度的最后一天(2014-03-31),这个日期不在离散的起始日索引中,因此抛出KeyError。 - 而
loc["2015-Q1"]会被解析为2015-03-31,如果你的重采样结果中没有2015年的索引(比如原始数据只到2014年),Pandas的loc会自动匹配小于等于该日期的最大索引,也就是2014年Q4的起始日2014-10-01,因此返回2014年的数据。
解决方法
直接匹配季度起始日字符串:
用季度起始的具体日期或无横杠的季度格式匹配,比如:df.resample("QS").sum().loc["2014-01-01"] # 或者 df.resample("QS").sum().loc["2014Q1"] # Pandas会将"2014Q1"解析为2014-01-01转换为PeriodIndex类型:
将重采样后的索引转为季度周期类型,这样就能直接用"2014-Q1"匹配:resampled_df = df.resample("QS").sum().to_period("Q") resampled_df.loc["2014-Q1"] # 正常返回预期结果
内容的提问来源于stack exchange,提问作者Someone1348
相关产品推荐
相关产品推荐

