如何重新采样到较粗的分辨率但在原始索引内采样?
Posted
技术标签:
【中文标题】如何重新采样到较粗的分辨率但在原始索引内采样?【英文标题】:How to resample to a coarser resolution but to samples within the original index? 【发布时间】:2022-01-15 10:54:52 【问题描述】:我有以下用例:
import pandas as pd
import numpy as np
# create dataframe
df = pd.DataFrame(data=np.random.rand(10, 3),
columns=['a', 'b'],
index=pd.date_range('2021-01-01', periods=10, freq='W-FRI'))
# data is random, I'm just saving time with copy paste first row
df
> a b
> 2021-01-01 0.272628 0.974373
> 2021-01-08 0.272628 0.974373
> 2021-01-15 0.272628 0.974373
> 2021-01-22 0.272628 0.974373
> 2021-01-29 0.272628 0.974373
> 2021-02-05 0.759018 0.443803
> 2021-02-12 0.759018 0.443803
> 2021-02-19 0.759018 0.443803
> 2021-02-26 0.759018 0.443803
> 2021-03-05 0.973900 0.929002
我想在重新采样时获得索引中的第一个匹配样本,但执行以下操作不起作用,请注意日期不在我的原始索引中:
df.resample('M').first()
> a b
> 2021-01-31 0.272628 0.160300
> 2021-02-28 0.759018 0.443803
> 2021-03-31 0.973900 0.929002
我想按月重新采样,但每次都取第一个匹配日期样本,即,我想要以下结果:
> a b
> 2021-01-01 0.272628 0.160300
> 2021-02-05 0.759018 0.443803
> 2021-03-05 0.973900 0.929002
我可以按如下方式进行破解,但这并不理想,它仅适用于这个玩具示例:
df.loc[list(np.diff(df.index.month.values, prepend=0) == 1)]
【问题讨论】:
【参考方案1】:一种方法是将索引转换为句点,然后删除重复项:
months = df.index.to_series().dt.to_period('M')
df[~month.duplicated()]
另一个,实际上可能更好,是groupby().head()
df.groupby(pd.Grouper(freq='M')).head(1)
输出:
a b
2021-01-01 0.695784 0.228550
2021-02-05 0.188707 0.278871
2021-03-05 0.935635 0.785341
【讨论】:
以上是关于如何重新采样到较粗的分辨率但在原始索引内采样?的主要内容,如果未能解决你的问题,请参考以下文章