如何重新采样到较粗的分辨率但在原始索引内采样?

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

【讨论】:

以上是关于如何重新采样到较粗的分辨率但在原始索引内采样?的主要内容,如果未能解决你的问题,请参考以下文章

在python中从PDF中提取图像而不重新采样?

音视频一文搞懂音频视频中的采样率采样精度码率分辨率

码率、帧率是啥?解析视频码率、帧率、分辨率的关系

iOS Vision API 重采样导致结果冲突,?

单片机内置ADC如何实现高分辨率采样?

ArcGIS栅格分辨率重采样求助