Python 基于索引条件挤压/聚合行

Python 基于索引条件挤压/聚合行,python,pandas,dataframe,Python,Pandas,Dataframe,我刚接触熊猫,几天来一直在为一个特殊的问题而挣扎。我有一个加密定价的数据集,时间间隔为1分钟,一直追溯到2012年() 看起来是这样的: open close high low volume timestamp 1364774820 93.25 93.300000 93.30

我刚接触熊猫,几天来一直在为一个特殊的问题而挣扎。我有一个加密定价的数据集,时间间隔为1分钟,一直追溯到2012年()

看起来是这样的:

                open         close      high       low     volume
timestamp                                                        
1364774820     93.25     93.300000     93.30     93.25  93.300000
1364774880    100.00    100.000000    100.00    100.00  93.300000
1364774940     93.30     93.300000     93.30     93.30  33.676862
1364775060     93.35     93.470000     93.47     93.35  20.000000
1364775120     93.47     93.470000     93.47     93.47   2.021627
...              ...           ...       ...       ...        ...
1615302420  54566.00  54584.000000  54585.00  54566.00   0.442658
1615302480  54586.00  54586.733478  54598.00  54586.00   2.802892
1615302540  54586.00  54513.000000  54587.00  54501.00   9.255249
1615302600  54511.00  54464.316913  54511.00  54456.00  12.339995
1615302660  54456.00  54456.000000  54460.00  54456.00   1.023890

[3244157 rows x 5 columns]

我要做的是从这些数据中推导出一个5分钟的时间间隔。这意味着我需要执行以下操作:

  • 以300秒的间隔设置新数据帧的索引,从1364774700开始

    ts = data.index[0]
    ts -= (ts % 300)
    te = data.index[-1]
    te -= (te % 300)
    t5min = [x for x in range(ts, te + 300, 300)]
    df = pd.DataFrame(index=t5min, columns=data.columns)
    
  • 在新df中,以1分钟的间隔对300秒间隔内的所有体积数据求和

  • 根据范围内的1分钟间隔数据点,调整新5分钟间隔的ohlc

  • 以增加的时间间隔(15分钟、20分钟、1小时等)将生成的数据帧用作更多新数据帧的输入

我已经提出了一些简陋的解决方案,但它们速度非常慢,可能需要几天才能执行。我还研究了groupby/agg/apply的使用,但还没有结果。因为我对熊猫还不熟悉,所以我希望向一些专家学习,希望能做得更优雅一些

编辑:不一定要寻找一个完整的解决方案,但如果有人能告诉我一些例子或函数的方向,我可以用它们来做这件事,那就太好了

接近 使用
pd将数据帧的
index
转换为
datetime
索引,然后使用
floor
将该索引转换为
5min
频率,创建
5min
分组,然后
group
将该分组上的数据帧分组,并首先使用
聚合列
open
使用
last
关闭
high
使用
max
low
使用
min
volume
使用
sum

agg_dict = {'open':'first', 'close': 'last', 
            'high': 'max', 'low': 'min', 'volume': 'sum'}

out = df.groupby(pd.to_datetime(df.index, unit='s').floor('5min')).agg(agg_dict)
结果 对于示例数据帧

>>> out
                         open     close      high       low      volume
timestamp                                                              
2013-04-01 00:05:00     93.25     93.30    100.00     93.25  220.276862
2013-04-01 00:10:00     93.35     93.47     93.47     93.35   22.021627
2021-03-09 15:05:00  54566.00  54513.00  54598.00  54501.00   12.500799
2021-03-09 15:10:00  54511.00  54456.00  54511.00  54456.00   13.363885

哇!先生,你是某种巫师。这正是我所需要的,基本上是两行代码。难以置信的谢谢