繁体   English   中英

获取按时间频率聚合的 dataframe 高低的时间/索引

[英]Get time/index of high and low of dataframe aggegated by time frequency

我有以下 dataframe dataframe 跨越多天,具有 1 分钟的 OHLCV 值。 dataframe 将是相当大的,20 年的数据。 (我估计 1 年大约有 117,000 行......)。

                       open    high     low   close   volume  
date
2022-09-08 15:30:00  314.69  314.83  313.83  314.11   764.54   
2022-09-08 15:31:00  314.10  314.22  313.86  314.08   184.55    
2022-09-08 15:32:00  314.20  314.37  313.98  314.14   170.66    
2022-09-09 21:55:00  322.54  322.54  322.39  322.50   184.44    
2022-09-09 21:56:00  322.48  322.48  322.31  322.38   296.67    
2022-09-09 21:57:00  322.38  322.40  322.30  322.33   253.45    

每天我想返回“high”列的最大值和“low”列的最小值的日期和时间。

所以结果就是这种情况。

             high                   low    
date
2022-09-08   2022-09-08 15:30:00    2022-09-08 15:30:00
2022-09-09   2022-09-09 21:55:00    2022-09-09 21:57:00   

如果有人可以帮助我以有效的方式做到这一点,我将不胜感激。

Thanks a lot!
Ivo

我很想看看有人带回来的是什么单线。 但这是一个可行的解决方案。

基本上,使用idxmax function 获取“高”列中具有最大值的行,使用idxmin function 获取“低”列中具有最小值的行。 然后在最后将这两个帧合并在一起。

df = pd.DataFrame([
    ['2022-09-08 15:30:00', 314.69,  314.83,  313.83,  314.11,   764.54],
    ['2022-09-08 15:31:00', 314.10,  314.22,  313.86,  314.08,   184.55],    
    ['2022-09-08 15:32:00', 314.20,  314.37,  313.98,  314.14,   170.66],
    ['2022-09-09 21:55:00', 322.54,  322.54,  322.39,  322.50,   184.44],    
    ['2022-09-09 21:56:00', 322.48,  322.48,  322.31,  322.38,   296.67],    
    ['2022-09-09 21:57:00', 322.38,  322.40,  322.30,  322.33,   253.45]  
], columns=['datetime', 'open', 'high', 'low', 'close', 'volume']

)

df['date'] = pd.to_datetime(df['datetime']).dt.date

df_max = df[['date','datetime']].loc[df.groupby('date')['high'].idxmax()]
df_max.rename(columns = {'datetime':'max_datetime'}, inplace = True)

df_min = df[['date','datetime']].loc[df.groupby('date')['low'].idxmin()]
df_min.rename(columns = {'datetime':'min_datetime'}, inplace = True)

xx = pd.merge(df_max, df_min, how='left', on='date')
日期 最大日期时间 min_datetime
2022-09-08 2022-09-08 15:30:00 2022-09-08 15:30:00
2022-09-09 2022-09-09 21:55:00 2022-09-09 21:57:00

在日期时间索引上使用groupby.aggidxmin / idxmax

# ensure datetime
df.index = pd.to_datetime(df.index)

out = (df
   .groupby(df.index.date)
   .agg({'high': 'idxmax',
         'low': 'idxmin'})
   .rename_axis('date')
 )

Output:

                          high                 low
date                                              
2022-09-08 2022-09-08 15:30:00 2022-09-08 15:30:00
2022-09-09 2022-09-09 21:55:00 2022-09-09 21:57:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM