You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas筛选ETF月度最后交易日数据并汇总月度成交量

解决方案

核心思路

按ETF代码+年月分组,完成两个核心操作:

  • 提取每组内最后一个交易日的行情数据(Open/Close/Low/High)
  • 计算每组内的月度成交量总和,替换该交易日的Volume字段

步骤实现(假设你的DataFrame名为df,包含列:ETF_Code, Date, Open, Close, Low, High, Volume)

  1. 预处理:规范日期格式并排序
    先确保日期列是datetime类型,同时按ETF和日期升序排序,保证取到的是当月最后一个交易日:
import pandas as pd

# 转换日期列格式为datetime
df['Date'] = pd.to_datetime(df['Date'])
# 按ETF代码和日期升序排序
df = df.sort_values(by=['ETF_Code', 'Date'])
  1. 计算月度成交量总和并匹配到对应行
    使用transform方法,给每行添加对应ETF当月的成交量总和:
# 按ETF+年月分组,生成月度成交量总和列
df['monthly_volume_sum'] = df.groupby(
    ['ETF_Code', df['Date'].dt.to_period('M')]
)['Volume'].transform('sum')
  1. 筛选当月最后一个交易日并替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:03:22