【问题标题】:Custom time series resampling in PandasPandas 中的自定义时间序列重采样
【发布时间】:2014-09-29 22:44:08
【问题描述】:

我有一个频率为 1m 的 OHLC 数据的 df:

                        Open     High      Low    Close
DateTime                                               
2005-09-06 18:00:00  1230.25  1231.50  1230.25  1230.25
2005-09-06 18:01:00  1230.50  1231.75  1229.25  1230.50
.
.
2005-09-07 15:59:00  1234.50  1235.50  1234.25  1234.50
2005-09-07 16:00:00  1234.25  1234.50  1234.25  1234.25

我需要进行适合期货小时数据的“自定义”重新采样,其中:

  • 每天从前一天的 18:00:00 开始(周一从周日 18:00:00 开始)
  • 每天在当天的 16:00:00 结束
  • 时间戳应该是收盘时间,而不是开盘时间。

重新采样后,输出应该是:

                        Open     High      Low    Close
DateTime                                               
2005-09-07 16:00:00  1230.25  1235.50  1229.25  1234.25

地点:

  • 打开 = 第一个(列打开)于 2005-09-06 18:00:00
  • 高 = 2005-09-06 18:00:00 到 2005-09-07 16:00:00 的最大值(列高)
  • 从 2005-09-06 18:00:00 到 2005-09-07 16:00:00 的最低 = 最低(列低)
  • 关闭 = 最后一次(列关闭)于 2005-09-07 16:00:00

我试过了:

  • 更改参数规则和基数,但不起作用。
  • 使用 reindex 没有成功。

我使用了以下“方法”:

conversion = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'}

【问题讨论】:

  • 能不能把每一天都作为当天的18:00结束,否则,16:00到18:00之间的DateTimes应该怎么办?
  • @unutbu 这是个好问题。您可以在 16:01 到 17:59 之间丢弃该数据。谢谢。

标签: python python-2.7 pandas time-series


【解决方案1】:
import pandas as pd
df = pd.read_table('data', sep='\s{2,}')
# Make sure the index is a DatetimeIndex
df.index = pd.DatetimeIndex(df.index)

# discard rows whose time falls between 16:00 and 18:00
df = df.between_time('18:00', '16:00', include_start=True, include_end=True)

proxy = df.index + pd.DateOffset(hours=6)
result = df.groupby(proxy.date).agg(
    {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
result = result.reindex(columns=['Open','High','Low','Close'])
print(result)

产量

               Open    High      Low    Close
2005-09-07  1230.25  1235.5  1229.25  1234.25

上面的代码创建了一个代理日期,其计算方法是将索引中的每个日期时间加上 6 小时。然后将此代理日期用作groupby 值。

In [112]: proxy = pd.DatetimeIndex(df.index) + pd.DateOffset(hours=6)

查看代理值如何与索引对应:

In [116]: pd.Series(proxy.date, index=df.index)
Out[116]: 
DateTime
2005-09-06 18:00:00    2005-09-07
2005-09-06 18:01:00    2005-09-07
2005-09-07 15:59:00    2005-09-07
2005-09-07 16:00:00    2005-09-07
dtype: object

【讨论】:

  • 所以我在 3mill 行的真实 df 中运行它,大约需要 3 分钟。它工作正常,除了有一天由于某种原因它没有给出正确的打印。我必须检查细节。你觉得你能告诉我如果你可以把每一天都当作当天的 18:00 结束,你会怎么做吗?
  • 基本上相同的代码应该可以工作;只需删除以 df = df.between_time(...) 开头的行。
  • 非常感谢!这正是我需要的。它在 1 分钟 35 秒内运行。我会尝试让它运行得更快。如果您有任何建议,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多