【发布时间】:2014-08-09 20:08:25
【问题描述】:
我怀疑很多从事时间序列数据工作的人已经遇到过这个问题,而且 pandas 似乎还没有提供一个简单的解决方案(还没有!):
假设:
- 您有一个时间序列的每日收盘价数据,按日期(天)索引。
- 今天是 6 月 19 日。最后收盘数据值为 18JUN。
- 您希望将每日数据重新采样到 OHLC 条形图中,并以某个给定的频率(比如 M 或 2M)在 6 月 18 日结束。
所以对于 M 频率,最后一根柱子是 19MAY-18JUN,前一根柱子是 19APR-18MAY,依此类推......
ts.resample('M', how='ohlc')
将进行重新采样,但 'M' 是 'end_of_month' 期间,因此结果将给出 2014-05 的整月和 2014-06 的 2 周期间,因此您的最后一个条形图不会是 '每月酒吧'。这不是我们想要的!
使用2M 频率,给定我的样本时间序列,我的测试给出了最后一个标记为 2014-07-31(之前标记为 2014-05-31)的柱状图,这是非常具有误导性的,因为没有 7 月份的数据。 ... 假定的最后 2 个月条形图再次仅涵盖最近 2 周。
正确的 DatetimeIndex 很容易创建:
pandas.date_range(end='2014-06-18', freq='2M', periods=300) + datetime.timedelta(days=18)
(Pandas 文档更喜欢通过
pandas.date_range(end='2014-06-18', freq='2M', periods=300) + pandas.tseries.offsets.DateOffset(days=18)
但我的测试表明,这种方法虽然更 'pandaïc' 慢 2 倍!)
无论哪种方式,我们都无法将正确的 DatetimeIndex 应用于 ts.resample()。
pandas 开发团队 (Date ranges in Pandas) 似乎意识到了这个问题,但与此同时,您如何解决这个问题以使 OHLC 的滚动频率锚定在时间序列的最后一天?
【问题讨论】:
标签: python pandas time-series