基于Pandas筛选ETF月度最后交易日数据并汇总月度成交量
解决方案
核心思路
按ETF代码+年月分组,完成两个核心操作:
- 提取每组内最后一个交易日的行情数据(Open/Close/Low/High)
- 计算每组内的月度成交量总和,替换该交易日的Volume字段
步骤实现(假设你的DataFrame名为df,包含列:ETF_Code, Date, Open, Close, Low, High, Volume)
- 预处理:规范日期格式并排序
先确保日期列是datetime类型,同时按ETF和日期升序排序,保证取到的是当月最后一个交易日:
import pandas as pd # 转换日期列格式为datetime df['Date'] = pd.to_datetime(df['Date']) # 按ETF代码和日期升序排序 df = df.sort_values(by=['ETF_Code', 'Date'])
- 计算月度成交量总和并匹配到对应行
使用transform方法,给每行添加对应ETF当月的成交量总和:
# 按ETF+年月分组,生成月度成交量总和列 df['monthly_volume_sum'] = df.groupby( ['ETF_Code', df['Date'].dt.to_period('M')] )['Volume'].transform('sum')
- 筛选当月最后一个交易日并替换Volume
分组取每组最后一行,再将原Volume替换为月度总和:
# 分组提取每月最后一个交易日的数据 monthly_result = df.groupby( ['ETF_Code', df['Date'].dt.to_period('M')] ).last().reset_index(drop=False) # 替换Volume字段为月度总和,清理冗余列 monthly_result['Volume'] = monthly_result['monthly_volume_sum'] monthly_result = monthly_result.drop(columns=['monthly_volume_sum'])
关键注意事项
- 若
Date列已是datetime类型,可跳过转换步骤,但排序必须保留,否则last()可能取到错误的行。 - 若同一ETF在同一天有多条数据,需额外处理(比如聚合当日行情),但常规行情数据不会出现这种情况。
- 最终结果可直接用于月度环比分析,比如计算收盘价环比:
# 计算收盘价月度环比(百分比) monthly_result['Close_MoM'] = monthly_result.groupby('ETF_Code')['Close'].pct_change() * 100
内容的提问来源于stack exchange,提问作者Nino.Ninov
相关产品推荐
相关产品推荐

