Pandas查找高频数据框中每小时/分钟的最后一行



假设数据帧如下。我希望在df数据框中添加一列,该列获取当前行的价格,并从当前小时/分钟之前的最后一个索引5分钟的价格中减去它。我试图引用一个minute_df并读取当前的小时/分钟,并从minute_df拉收盘价,但没有得到一个工作的解决方案。df索引为datetime64。

例如,在06:27:12,它应该取这一行的价格,减去06:22最后一个指数的收盘价,因为这是06:27之前的5分钟。对于06:27分钟内的每个指数,它应该引用这个收盘价进行计算,直到它变成06:28,然后应该从06:23的最后一个指数中减去。

df

TimeStamp                           Price   Q  hour min
2022-10-05 05:30:11.344618-05:00    8636    1   5   30
2022-10-05 05:30:12.647597-05:00    8637    1   5   30
2022-10-05 05:30:20.080559-05:00    8637    1   5   30
2022-10-05 05:30:21.267389-05:00    8637    2   5   30
2022-10-05 05:30:21.267952-05:00    8636    1   5   30

minute_df

TimeStamp                   open    high    low     close
2022-10-05 05:30:00-05:00   8636    8645    8635    8645
2022-10-05 05:31:00-05:00   8645    8647    8637    8638
2022-10-05 05:32:00-05:00   8639    8650    8639    8649
2022-10-05 05:33:00-05:00   8648    8652    8648    8649

预期输出是df数据框中的一列,其中包含当前价格-收盘价的值,或当前分钟前5分钟的最后一个索引的价格。NaN值,直到有足够的行来回顾这么多周期。

df("price_change")

不确定我是否理解正确,但这是我的尝试

如果TimeStamp是列

# Remove the seconds and microseconds
floor_ts = df.TimeStamp.dt.floor("min")
# Get last 5 minute timestamp
last_index_5_ts = floor_ts - pd.Timedelta(5, unit="min")
# Create dict from minute_df TimeStamp to close price
ts_to_close_dict = dict(zip(minute_df.TimeStamp, minute_df.close))
close_price_v = last_index_5_ts.map(ts_to_close_dict)
df["price_change"] = df.Price - close_price_v
df

相同的代码,但如果TimeStamp是索引

floor_ts = df.index.floor("min")
last_index_5_ts = floor_ts - pd.Timedelta(5, unit="min")
ts_to_close_dict = dict(zip(minute_df.index, minute_df.close))
close_price_v = last_index_5_ts.map(ts_to_close_dict)
df["price_change"] = df.Price - close_price_v
df

一些笔记:

  • 我不确定你是什么意思关于处理NaN值,但如果你需要向前填充/向后填充他们,你可以使用pd.fillna
  • 上面的一些pandas功能(如floor)可能在旧的熊猫版本中缺失

编辑:我没有注意到df已经有hourminute列了。你可以用它来计算floor_ts(虽然不确定它是否更容易/更快)

最新更新