【问题标题】:Resample pandas DataFrame of OHLC data into three-day bars ignoring weekends将 OHLC 数据的 pandas DataFrame 重新采样为三天的柱状图,忽略周末
【发布时间】:2020-04-16 12:49:34
【问题描述】:

我有以开盘价、最高价、最低价、收盘价和日期为索引的每日价格数据。我想创建三天的酒吧,但我希望这些酒吧“在周末结束”,所以我最终得到了 MTuW、TuWTh、WThF、ThFM 和 FMTu 酒吧。

(MTuW = 周一周二周三)

(FMTu = 周五周一周二)

(FSaSu = 周五周六周日)

我试过了

df = df.asfreq('B')
df = df.resample('3D').mean()

但这似乎只适用于 MTuW、TuWTh 和 WThF 酒吧。其他酒吧似乎没有跳过周末,这意味着 FMTu 酒吧实际上是 FSaSu 酒吧,或者更准确地说是周五酒吧。

我相信有办法让这项工作也许与

from pandas.tseries.offsets import BDay

但我不清楚如何让它发挥作用。

【问题讨论】:

  • 愿意分享一些示例数据吗?您的代码看起来不错。

标签: python python-3.x pandas python-datetime


【解决方案1】:

我没有对此进行测试,但我认为您只需要使用:

df = df.resample('3B').mean()

更新

为了也适应假期,使用自定义规则重新采样:

from pandas.tseries.offsets import CustomBusinessDay
from pandas.tseries.holiday import USFederalHolidayCalendar

bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())

df = df.resample(bday_us).mean()

我在这里使用了USFederalHolidayCalendar。要了解此类假期课程的假期概览:

>>> pprint(USFederalHolidayCalendar().rules)
[Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x10db3ce18>),
 Holiday: Dr. Martin Luther King Jr. (month=1, day=1, offset=<DateOffset: weekday=MO(+3)>),
 Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: weekday=MO(+3)>),
 Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
 Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x10db3ce18>),
 Holiday: Labor Day (month=9, day=1, offset=<DateOffset: weekday=MO(+1)>),
 Holiday: Columbus Day (month=10, day=1, offset=<DateOffset: weekday=MO(+2)>),
 Holiday: Veterans Day (month=11, day=11, observance=<function nearest_workday at 0x10db3ce18>),
 Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: weekday=TH(+4)>),
 Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x10db3ce18>)]

显然,这样的节日对象也可以从头开始定制和构建。更多假期班信息:https://pandas.pydata.org/pandas-docs/stable/timeseries.html#holidays-holiday-calendars

【讨论】:

  • 这个简洁优雅,非常感谢!不过,一个问题是它会跳过周末,但不会跳过交易假期。因此,例如,没有 2018 年 1 月 15 日星期一(小马丁路德金纪念日)的数据,但我的三天柱包括那一天,仅由两个交易日和那一天组成。我相信这种认识改变了我的问题。我需要通过每三个数据条分组来重新采样,忽略星期几。这很容易在评论中回答,还是我应该问一个新问题?
  • 更新了我的答案。看起来对于您的具体情况,您可以使用df = df.resample(3 * bday_us).mean()。你能确认一下吗?
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 2019-09-30
  • 2021-11-18
  • 2022-01-05
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
相关资源
最近更新 更多