【问题标题】:Upsampling to weekly data in pandas对 Pandas 中的每周数据进行上采样
【发布时间】:2012-10-02 10:23:18
【问题描述】:

在 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) 将在该月结束的所有周设置为每月价值。实现这一目标的方法可能是什么?我可以想象也想将此扩展到双周数据。

编辑:理想情况下我希望案例 (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

【问题讨论】:

  • 我意识到这样做的一种方法可能是将上采样到每日数据,然后再下采样到每周数据。不过,仍然有兴趣知道是否有更直接的方法。

标签: python pandas


【解决方案1】:

我就您的问题发送了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 中。

【讨论】:

  • 感谢您创建 github 问题。至于给出的重采样示例,不幸的是它并没有完全返回我想要的东西。从ffill 切换到bfill 更接近于哪些单元格填充了哪些值,但它仍然在 4 月进行了观察,并且在 Janaury 中没有观察到(请参阅我对原始帖子的编辑以获取我最感兴趣的日期范围)。有趣的是,在 2 月至 4 月系列而不是原来的 1 月至 3 月系列中上采样然后下采样回到每月结果。
  • 您是否有指向 github 线程或其他有关即将推出的“span”功能的文档的链接?
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2015-09-08
  • 2016-07-23
相关资源
最近更新 更多