Skip to main content
 首页 » 编程设计

python之对 Pandas 中的每周数据进行上采样

2025年05月04日10grandyang

在 pandas 中获取较低频率的时间序列(例如月度或季度数据)并将其上采样到每周频率时,我遇到了问题。例如,

data = np.arange(3, dtype=np.float64) 
s = Series(data, index=date_range('2012-01-01', periods=len(data), freq='M')) 
s.resample('W-SUN') 

导致一系列到处都是 NaN。如果我这样做,基本上会发生同样的事情:

s.reindex(DatetimeIndex(start=s.index[0].replace(day=1), end=s.index[-1], freq='W-SUN')) 

如果s被 PeriodIndex 索引而不是我会得到一个错误:ValueError: Frequency M cannot be resampled to <1 Week: kwds={'weekday': 6}, weekday=6>

我能理解为什么会发生这种情况,因为周日期与月日期并不完全一致,而且周可以与月重叠。但是,无论如何,我想实现一些简单的规则来处理这个问题。特别是,(1) 将月末的最后一周设置为月值,(2) 将月末的第一周设置为月值,或 (3) 将月末的所有周设置为月值值(value)。实现这一目标的方法可能是什么?我可以想象也想将其扩展到双周数据。

编辑:我最希望情况 (1) 的输出示例如下:

2012-01-01   NaN 
2012-01-08   NaN 
2012-01-15   NaN 
2012-01-22   NaN 
2012-01-29   0 
2012-02-05   NaN 
2012-02-12   NaN 
2012-02-19   NaN 
2012-02-26   1 
2012-03-04   NaN 
2012-03-11   NaN 
2012-03-18   NaN 
2012-03-25   2 

请您参考如下方法:

我做了一个github issue关于你的问题。需要给 pandas 添加相关的特征。

情况 3 可直接通过 fill_method 实现:

In [25]: s 
Out[25]:  
2012-01-31    0 
2012-02-29    1 
2012-03-31    2 
Freq: M 
 
In [26]: s.resample('W', fill_method='ffill') 
Out[26]:  
2012-02-05    0 
2012-02-12    0 
2012-02-19    0 
2012-02-26    0 
2012-03-04    1 
2012-03-11    1 
2012-03-18    1 
2012-03-25    1 
2012-04-01    2 
Freq: W-SUN 

但对于其他人,您现在必须做一些扭曲,希望在下一个版本之前通过 github 问题得到补救。

此外,您似乎还想要即将到来的“跨度”重采样约定,该约定将从第一个周期的开始到最后一个周期的结束进行上采样。我不确定是否有一种简单的方法来锚定 DatetimeIndex 的起点/终点,但它至少应该存在于 PeriodIndex 中。