Pandas在高频 Dataframe 中查找每小时/分钟的最后一行

nszi6y05  于 2022-12-21  发布在  其他
关注(0)|答案(1)|浏览(153)

假设一个 Dataframe 如下所示。我希望向df Dataframe 添加一列,该列获取当前行的价格,并从当前小时/分钟之前5分钟的最后一个索引的价格中减去该价格。我尝试引用minute_df并读取当前小时/分钟,然后从minute_df中提取收盘价,但没有得到有效的解。df索引为datetime 64。
例如,在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

分钟_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 Dataframe 中的一列,包含当前价格的值-收盘价,或当前分钟前5分钟的最后一个指数的价格。NaN个值,直到有足够的行来回顾这么多个周期。
df ['价格变动']

kmpatx3s

kmpatx3s1#

不确定我是否理解正确,但我尝试了一下
如果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)在旧的panda版本中可能会丢失

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

相关问题