Python pandas 将 15 分钟 ohlc 重采样为 75 分钟 ohlc

Python pandas resample 15 minutes ohlc to 75 minutes ohlc

以下是印度市场一只股票的数据框。

open    high     low   close  volume
date                                                             
2021-06-17 09:15:00+05:30  815.55  819.15  807.05  818.45   54372
2021-06-17 09:30:00+05:30  818.45  820.70  817.20  818.00   22417
2021-06-17 09:45:00+05:30  818.00  820.70  818.00  820.00   14685
2021-06-17 10:00:00+05:30  820.00  820.55  818.45  820.55   17466
2021-06-17 10:15:00+05:30  820.55  823.75  820.00  821.00   31069
2021-06-17 10:30:00+05:30  821.00  821.00  818.40  818.45   11139
2021-06-17 10:45:00+05:30  819.05  819.55  817.20  819.25   17747
2021-06-17 11:00:00+05:30  819.35  820.30  818.80  819.00    6770
2021-06-17 11:15:00+05:30  819.50  819.50  817.60  818.55    7616
2021-06-17 11:30:00+05:30  818.95  819.50  818.00  819.40    6856
2021-06-17 11:45:00+05:30  818.90  820.00  818.55  819.90    4147
2021-06-17 12:00:00+05:30  819.90  822.90  818.15  822.45   18668
2021-06-17 12:15:00+05:30  822.45  822.50  820.35  820.55    8529
2021-06-17 12:30:00+05:30  820.50  821.95  819.00  821.50   15214
2021-06-17 12:45:00+05:30  821.95  822.25  821.00  821.50    6072
2021-06-17 13:00:00+05:30  821.50  824.25  820.80  824.25   26428
2021-06-17 13:15:00+05:30  824.70  827.00  823.50  825.65   54448
2021-06-17 13:30:00+05:30  825.70  828.40  825.50  828.25   56071
2021-06-17 13:45:00+05:30  828.10  829.95  823.60  824.20   76385
2021-06-17 14:00:00+05:30  824.20  825.30  821.65  822.20   36921
2021-06-17 14:15:00+05:30  822.70  823.95  821.25  822.75   25237
2021-06-17 14:30:00+05:30  822.75  823.95  821.50  822.55   22952
2021-06-17 14:45:00+05:30  822.55  822.60  820.15  821.90   22285
2021-06-17 15:00:00+05:30  821.60  822.75  820.45  820.65   28557
2021-06-17 15:15:00+05:30  820.45  821.80  818.00  819.65   50378
2021-06-18 09:15:00+05:30  820.50  835.00  820.50  831.40  246519
2021-06-18 09:30:00+05:30  831.00  833.35  829.00  830.00  142612
2021-06-18 09:45:00+05:30  830.00  830.55  822.50  822.80  114185
2021-06-18 10:00:00+05:30  823.45  827.25  821.85  824.45   57072
2021-06-18 10:15:00+05:30  824.45  826.30  822.25  822.40   29404
2021-06-18 10:30:00+05:30  822.40  823.95  819.55  821.00   48454
2021-06-18 10:45:00+05:30  821.20  821.85  811.95  812.75   69394
2021-06-18 11:00:00+05:30  812.75  822.00  812.60  821.30   70689
2021-06-18 11:15:00+05:30  821.30  822.35  819.55  822.00   25185
2021-06-18 11:30:00+05:30  821.90  822.00  820.05  820.90   17239
2021-06-18 11:45:00+05:30  821.15  822.85  820.30  822.50   17539
2021-06-18 12:00:00+05:30  822.50  822.50  820.30  822.10   19281
2021-06-18 12:15:00+05:30  822.10  824.15  821.00  823.55   24699
2021-06-18 12:30:00+05:30  823.50  823.85  821.30  823.55   14806
2021-06-18 12:45:00+05:30  823.20  823.80  821.40  822.25    9944
2021-06-18 13:00:00+05:30  822.25  822.25  818.60  820.45   15122
2021-06-18 13:15:00+05:30  820.45  821.80  817.00  817.60   12859
2021-06-18 13:30:00+05:30  817.60  819.75  817.20  819.70   14129
2021-06-18 13:45:00+05:30  819.70  821.65  819.00  821.00    9999
2021-06-18 14:00:00+05:30  821.50  822.25  820.50  820.65   10744
2021-06-18 14:15:00+05:30  820.65  822.00  820.45  822.00   11466
2021-06-18 14:30:00+05:30  822.00  823.50  821.25  822.80   14608
2021-06-18 14:45:00+05:30  822.75  827.00  822.25  824.35   36461
2021-06-18 15:00:00+05:30  824.35  826.85  822.00  825.70  127325
2021-06-18 15:15:00+05:30  826.20  828.60  825.05  826.00  119421

根据观察,第一根蜡烛在 9:15 开始,最后一根蜡烛在 15 分钟的时间范围内在 3:15 结束。

我正在尝试将此数据重新采样为 75 分钟时间。

我试过下面的代码

df=df.resample(rule='75T', closed='left', label='left',origin=df.index.min()).agg(OrderedDict([('open', 'first'),('high', 'max'),('low', 'min'),('close', 'last'),('volume', 'sum')])).dropna()

这确实产生了几乎正确的结果,除了一个问题。

open    high     low   close   volume
date                                                              
2021-06-17 09:15:00+05:30  815.55  823.75  807.05  821.00   140009
2021-06-17 10:30:00+05:30  821.00  821.00  817.20  819.40    50128
2021-06-17 11:45:00+05:30  818.90  822.90  818.15  821.50    52630
2021-06-17 13:00:00+05:30  821.50  829.95  820.80  822.20   250253
2021-06-17 14:15:00+05:30  822.70  823.95  818.00  819.65   149409
2021-06-18 09:00:00+05:30  820.50  835.00  820.50  824.45   560388
2021-06-18 10:15:00+05:30  824.45  826.30  811.95  822.00   243126
2021-06-18 11:30:00+05:30  821.90  824.15  820.05  823.55    93564
2021-06-18 12:45:00+05:30  823.20  823.80  817.00  821.00    62053
2021-06-18 14:00:00+05:30  821.50  827.00  820.45  825.70   200604
2021-06-18 15:15:00+05:30  826.20  828.60  825.05  826.00   119421
2021-06-21 08:15:00+05:30  823.80  829.70  818.90  829.00    70687
2021-06-21 09:30:00+05:30  829.50  833.95  827.55  831.40   199029
2021-06-21 10:45:00+05:30  831.95  832.50  827.60  831.70    83466
2021-06-21 12:00:00+05:30  831.70  833.15  830.00  833.00    90051
2021-06-21 13:15:00+05:30  832.80  833.20  828.10  829.25    55181
2021-06-21 14:30:00+05:30  829.10  831.45  825.65  828.50   106299

正如我们在第一天看到的那样,一切看起来都很棒。第二天 (2021-06-18) 从 09:00 而不是 09:15 开始。此外,即使我没有在 15 分钟的时间范围内提供基础数据,第 3 天 (2021-06-21) 的结果从 08:15.

开始

我该如何解决这个问题?我希望蜡烛每天在 9:15 开始,最后一根蜡烛应该在 14:15 结束,因为印度市场在 15:30 下午关闭。

我认为问题在于 resampleoriginal 是索引的第一个值,而不是每天。要解决这个问题,您可以 groupby 日期并使用每个组的第一个索引:

print (df.groupby(df.index.date)
         .apply(lambda d: d.resample(rule='75T', closed='left', label='left', origin=d.index.min())
         .agg({'open':'first','high': 'max','low':'min','close': 'last','volume': 'sum'}).dropna()))

                                        open    high     low   close  volume
           date                                                             
2021-06-17 2021-06-17 09:15:00+05:30  815.55  823.75  807.05  821.00  140009
           2021-06-17 10:30:00+05:30  821.00  821.00  817.20  819.40   50128
           2021-06-17 11:45:00+05:30  818.90  822.90  818.15  821.50   52630
           2021-06-17 13:00:00+05:30  821.50  829.95  820.80  822.20  250253
           2021-06-17 14:15:00+05:30  822.70  823.95  818.00  819.65  149409
2021-06-18 2021-06-18 09:15:00+05:30  820.50  835.00  820.50  822.40  589792
           2021-06-18 10:30:00+05:30  822.40  823.95  811.95  820.90  230961
           2021-06-18 11:45:00+05:30  821.15  824.15  820.30  822.25   86269
           2021-06-18 13:00:00+05:30  822.25  822.25  817.00  820.65   62853
           2021-06-18 14:15:00+05:30  820.65  828.60  820.45  826.00  309281