如何结合Groupby与iloc获取股票月度首尾交易日开盘收盘价
解决方案
你原代码的问题在于:直接用schaeffler['Open'].iloc[0]作为聚合函数时,会取整个DataFrame的第一个Open值,而非每个月份分组内首个交易日的Open价格,不符合需求。
正确实现步骤:
- 先确保数据按日期排序:要获取每月首个/最后一个交易日的数据,必须保证DataFrame已按
Date升序排列:
schaeffler = schaeffler.sort_values('Date')
- 分组聚合:使用
groupby结合agg,针对不同列指定对应的聚合逻辑:
方式1:自定义单级列名(更直观)
schyr = schaeffler.groupby('Month_Yr').agg( 月初开盘价=('Open', lambda x: x.iloc[0]), 月末收盘价=('Close', lambda x: x.iloc[-1]), 月最高=('High', 'max'), 月最低=('Low', 'min'), 成交量均值=('Volume', 'mean'), 成交量方差=('Volume', 'var'), 成交量最高=('Volume', 'max'), 成交量最低=('Volume', 'min') ) print(schyr)
方式2:保留多级列名(和你原代码结构类似)
schyr = schaeffler.groupby('Month_Yr').agg({ 'Open': ['first'], # 等价于lambda x: x.iloc[0],前提是日期已排序 'Close': ['last'], 'High': ['max'], 'Low': ['min'], 'Volume': ['mean', 'var', 'max', 'min'] }) print(schyr)
关键说明:
- 若你的
Date列已经按时间顺序排列,first()和lambda x: x.iloc[0]效果一致;last()和lambda x: x.iloc[-1]效果一致。 - 如果数据未排序,必须先执行排序步骤,否则取到的“首个/最后一个”会是乱序的,不符合交易日逻辑。
内容的提问来源于stack exchange,提问作者Yogesh Kamboj
相关产品推荐
相关产品推荐

