尝试定位季度数据时出现 Pandas 错误

问题描述 投票:0回答:1

对于具有日期时间索引的数据框,我习惯于使用以下语法获取季度数据:

df.loc["2014-Q1"]
获取 2014 年第一季度(一月、二月、三月)的数据。

这在大多数情况下都可以正常工作,但在使用重新采样的数据帧时我遇到了一个错误。我不确定这是否是 pandas 的预期行为,或者这里是否存在极端情况错误。

我在 python 3.12 中使用 pandas 2.1.1。

最初的以下代码会产生预期的结果,例如:

df = pd.DataFrame(index=pd.date_range(start="2014-01-01", end="2023-01-01", freq="M"))
df.loc["2014-Q1"]

确实返回预期的数据帧(空,具有 2014 年第一季度的索引),例如

Empty DataFrame
Columns: []
Index: [2014-01-31 00:00:00, 2014-02-28 00:00:00, 2014-03-31 00:00:00]

但是,如果我尝试重新采样,则会出现意想不到的行为。

以下会引发错误,

df.resample("QS").sum().loc["2014-Q1"]

它本质上告诉我它找不到键值。

File ~/anaconda3/envs/py3/lib/python3.12/site-packages/pandas/core/indexes/datetimes.py:613, in DatetimeIndex.get_loc(self, key)
    611             return self._partial_date_slice(reso, parsed)
    612         except KeyError as err:
--> 613             raise KeyError(key) from err
    615     key = parsed
    617 elif isinstance(key, dt.timedelta):
    618     # GH#20464

KeyError: '2014-Q1'

当我开始深入研究这个问题时,我发现执行

df.loc[f"{year}-Q{quarter}"]
实际上可以搜索 年的数据。因为我的数据框没有 2013 年的索引,所以不会显示它。

使用相同的最小示例,我尝试过

df.resample("QS").sum().loc["2015-Q1"]

它返回的数据是 2014 年的!

Empty DataFrame
Columns: []
Index: [2014-01-01 00:00:00]

这是重采样后的正常行为,还是 pandas 中的错误?

python pandas python-datetime period
1个回答
0
投票

这看起来像 pandas bug,与

df.index.freq
属性相关。重采样后它被设置为
QS-Jan
。 在尝试 loc 之前设置
df.index.freq = None
可以解决该问题。我将在 pandas 存储库上提出问题。

© www.soinside.com 2019 - 2024. All rights reserved.