[英]Pandas find last row for each hour / minute in high frequency dataframe
假設一個數據框如下。 我正在尋找向 df 數據框添加一列,該列采用當前行的價格,並從當前小時/分鍾前 5 分鍾的最后一個索引的價格中減去它。 我試圖引用 minute_df 並讀取當前小時/分鍾並從 minute_df 中提取收盤價,但沒有找到可行的解決方案。 df 索引是 datetime64。
例如,在 06:27:12,它應該采用此行價格減去 06:22 的最后一個指數的收盤價,因為這是 06:27 之前的 5 分鍾。 06:27分鍾內的每一個指數,都應該參考這個收盤價計算,直到06:28分,再減去06:23的最后一個指數。
去向
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.fillnapandas
函數(比如floor
)在舊的 pandas 版本中可能會丟失編輯:我沒有注意到df
已經有hour
和minute
列。 您可以使用它來計算floor_ts
(雖然不確定它是否更容易/更快)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.