[英]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.agg
和idxmin
/ 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.