将 1 分钟的市场数据转换为 5 分钟的数据

Converting 1-minute market data into 5-minute data

这是我的数据框:

这就是我需要的:

这就是 .groupby(pd.Grouper(freq='5min')).agg({"open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum"}) 给我的:

  1. 我知道可以改为获取 5 分钟间隔的数据,但这会破坏我试图在 python 上变得更好的目的。
  2. 我打算在相同数据的 (10, 15, 30) 分钟时间范围内复制此过程。
  3. 这应该提供类似的数据框,只是具有不同的值:
import pandas as pd
import yfinance as yf
import datetime as dt
data = yf.download("INFY.NS", end = dt.datetime.today(), start = dt.datetime.today() - dt.timedelta(days=1), interval="1m")
data.index = pd.to_datetime(data.index)
data = data.between_time('09:31','15:30')

欢迎提供有关粘贴 python 数据框方法的指令。

编辑: 添加可复制代码和一些清晰度(以及解决方法!)

  1. 我打算将下面的数据帧分组为 5 分钟频率:
import pandas as pd
import datetime as dt
date = pd.to_datetime(['9:31', '9:32', '9:33', '9:34', '9:35', '9:36', '9:37', '9:38', '9:39', '9:40'])
a = pd.DataFrame({'Open': [1,2,3,4,5,6,7,8,9,10],
                  'High': [1,2,3,4,5,6,7,8,9,10],
                  'Low': [0,1,2,3,4,5,6,7,8,9],
                  'Close': [0,1,2,3,4,5,6,7,8,9],
                  'Volume': [10,11,12,13,14,15,16,17,18,19]}, index  = date)
  1. 我尝试如下使用 pandas.Grouper,但它会将数据聚合到不同的存储桶:
a.groupby(pd.Grouper(freq='5min')).agg({"Open": "first", "High": "max", "Low": "min", "Close": "last", "Volume": "sum"})
  1. 有了这个,索引 [09:31 - 09:34] 的数据是 grouped/aggregated 到索引 [09:30] 的单个行;但是,我需要将索引为 [09:31-09:35] 的数据分组到 [09:35]

  2. 我找到了一个解决方案,感谢@Daniel Weigel 和 pandas 文档:

b = a.groupby(pd.Grouper(freq='5min',origin='start',label='right')).agg({"Open": "first", "High": "max", "Low": "min", "Close": "last", "Volume": "sum"})
b.index += pd.Timedelta(minutes=-1)

欢迎任何suggestions/modifications改进解决方案! :)

我不确定我是否完全理解您的问题,但是您为什么不在石斑鱼操作后更改索引时间戳? 像

tmp.index=tmp.index.floor(freq='5min')+pd.Timedelta(minutes=5)

所以你一定要将你现有的时间戳降低到最接近底部的 5 分钟,然后再加上 5 分钟......其他频率的方法也是一样的。 因此,使用您现有的代码,即

tmp=data.groupby(pd.Grouper(freq='5min')).agg({"Open": "first", "High": "max", "Low": "min", "Close": "last", "Volume": "sum"})

tmp.index=tmp.index.floor(freq='5min')+pd.Timedelta(minutes=5)
tmp