如果仅在数据框中的特定时间之间,熊猫会合并股票数据

ami*_*r92 5 python dataframe stock pandas

我有 2017 年到 2019 年的每分钟股票数据。我只想保留每天 9:16 之后的数据,因此我想将 9:00 到 9:16 之间的任何数据转换为 9:16 的值,即:

09:16 的值应该是

  • open :从 9:00 到 9:16 的第一个数据的值,这里是 116.00
  • high : 最高值从 9:00 - 9:16,这里是 117.00
  • low :最低值从 9:00 - 9:16,这里是 116.00
  • close:这将是 9:16 的值,这里是 113.00

                       open    high     low   close
date                                               
2017-01-02 09:08:00  116.00  116.00  116.00  116.00
2017-01-02 09:16:00  116.10  117.80  117.00  113.00
2017-01-02 09:17:00  115.50  116.20  115.50  116.20
2017-01-02 09:18:00  116.05  116.35  116.00  116.00
2017-01-02 09:19:00  116.00  116.00  115.60  115.75
...                     ...     ...     ...     ...
2029-12-29 15:56:00  259.35  259.35  259.35  259.35
2019-12-29 15:57:00  260.00  260.00  260.00  260.00
2019-12-29 15:58:00  260.00  260.00  259.35  259.35
2019-12-29 15:59:00  260.00  260.00  260.00  260.00
2019-12-29 16:36:00  259.35  259.35  259.35  259.35
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

#Get data from/to 9:00 - 9:16 and create only one data item

convertPreTrade = df.between_time("09:00", "09:16") #09:00 - 09:16

#combine modified value to original data

df.loc[df.index.strftime("%H:%M") == "09:16" , 
    ["open","high","low","close"] ] = [convertPreTrade["open"][0],
                                        convertPreTrade["high"].max(),
                                        convertPreTrade["low"].min(),
                                        convertPreTrade['close'][-1] ] 
Run Code Online (Sandbox Code Playgroud)

但这不会给我准确的数据

Shu*_*rma 5


d = {'date': 'last', 'open': 'last',
     'high': 'max', 'low': 'min', 'close': 'last'}

# df.index = pd.to_datetime(df.index)
s1 = df.between_time('09:00:00', '09:16:00')
s2 = s1.reset_index().groupby(s1.index.date).agg(d).set_index('date')

df1 = pd.concat([df.drop(s1.index), s2]).sort_index()
Run Code Online (Sandbox Code Playgroud)

细节:

使用DataFrame.between_time在数据帧过滤行df,时间介于09:0009:16

print(s1)
                      open   high    low  close
date                                           
2017-01-02 09:08:00  116.0  116.0  116.0  116.0
2017-01-02 09:16:00  116.1  117.8  117.0  113.0
Run Code Online (Sandbox Code Playgroud)

使用DataFrame.groupby到这组数据帧过滤s1date和聚集使用字典d

print(s2)
                      open   high    low  close
date                                           
2017-01-02 09:16:00  116.1  117.8  116.0  113.0
Run Code Online (Sandbox Code Playgroud)

用于DataFrame.drop从原始数据框中删除df时间之间的行09:00-09:16,然后用于pd.concat将其与 连接s2,最后用于DataFrame.sort_index对索引进行排序:

print(df1)
                       open    high     low   close
date                                               
2017-01-02 09:16:00  116.10  117.80  116.00  113.00
2017-01-02 09:17:00  115.50  116.20  115.50  116.20
2017-01-02 09:18:00  116.05  116.35  116.00  116.00
2017-01-02 09:19:00  116.00  116.00  115.60  115.75
2019-12-29 15:57:00  260.00  260.00  260.00  260.00
2019-12-29 15:58:00  260.00  260.00  259.35  259.35
2019-12-29 15:59:00  260.00  260.00  260.00  260.00
2019-12-29 16:36:00  259.35  259.35  259.35  259.35
2029-12-29 15:56:00  259.35  259.35  259.35  259.35
Run Code Online (Sandbox Code Playgroud)