下采样到季度级别并在 Pandas 中获取季度结束日期值
Posted
技术标签:
【中文标题】下采样到季度级别并在 Pandas 中获取季度结束日期值【英文标题】:Downsample to quarter level and get quarter end date value in Pandas 【发布时间】:2022-01-07 01:11:43 【问题描述】:我的数据框从 2005-01-01 到 2021-10-31 的每日价值。
| C1 | C2
-----------------------------
2005-01-01 | 2.7859 | -7.790
2005-01-02 |-0.7756 | -0.97
2005-01-03 |-6.892 | 2.770
2005-01-04 | 2.785 | -0.97
. . .
. . .
2021-10-28 | 6.892 | 2.785
2021-10-29 | 2.785 | -6.892
2021-10-30 |-6.892 | -0.97
2021-10-31 |-0.7756 | 2.34
我想对该数据框进行下采样以获得四分之一值,如下所示。
| C1 | C2
------------------------------
2005-03-01 | 2.7859 | -7.790
2005-06-30 |-0.7756 | -0.97
2005-09-30 |-6.892 | 2.770
2005-12-31 | 2.785 | -0.97
我尝试使用 Pandas 重采样方法,但它需要聚合方法。
df = df.resample('Q').mean()
我不想要聚合值,我想要季度结束日期的当前值。
【问题讨论】:
你的意思是 2005-03-31 吗? @anarchy,我找不到你。我希望将每日价值数据框过滤到季度末日期行。 看你的例子,你写的是2005-03-01,那是三月的第一天,应该是2005-03-31吧?看看我的回答 【参考方案1】:您的代码可以正常工作,除非您没有使用正确的功能。将mean
替换为last
:
dti = pd.date_range('2005-01-01', '2021-10-31', freq='D')
df = pd.DataFrame(np.random.random((len(dti), 2)), columns=['C1', 'C2'], index=dti)
dfQ = df.resample('Q').last()
print(dfQ)
# Output:
C1 C2
2005-03-31 0.653733 0.334182
2005-06-30 0.425229 0.316189
2005-09-30 0.055675 0.746406
2005-12-31 0.394051 0.541684
2006-03-31 0.525208 0.413624
... ... ...
2020-12-31 0.662081 0.887147
2021-03-31 0.824541 0.363729
2021-06-30 0.064824 0.621555
2021-09-30 0.126891 0.549009
2021-12-31 0.126217 0.044822
[68 rows x 2 columns]
【讨论】:
【参考方案2】:你可以这样做,
df = df[df.index.is_quarter_end]
您将仅在每个季度末过滤掉日期。
【讨论】:
有效吗? @sekinod @anarchy。您的代码没有给出最后日期(2021-12-31),我不明白为什么......在我的示例上试试。 FIY,这里不需要.loc
。
@sekinod 是的,我不应该在这里添加 .loc,我的代码现在可以工作了吗?以上是关于下采样到季度级别并在 Pandas 中获取季度结束日期值的主要内容,如果未能解决你的问题,请参考以下文章
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的第一天(is quarter start)筛选dataframe数据中日期对象是所在季度第一天的数据行
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的最后一天(is quarter end)筛选dataframe数据中日期对象是所在季度最后一天的数据行
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的第一天(is quarter start)
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的第一天(is quarter start)