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

按月汇总股票成交量并绘图:代码返回零值问题求助

解决每月股票成交量求和的问题

嘿,我看你这代码的问题很明显——用错np.searchsorted的用法啦!你现在把分割位置直接传到成交量数组的searchsorted里,逻辑完全搞反了,才会导致求和结果全是0。咱们一步步来修正:

先搞懂核心问题

你原代码里的volumeYears=np.searchsorted(sp_volume, yearsplits)是完全错误的:np.searchsorted的作用是在目标有序数组中,找到待插入值的位置,你现在把年份的分割索引(比如几百、几千的整数)放到成交量数组里找位置,而成交量数值通常远大于这些索引值,所以所有插入位置都是0,自然求和全为0。

正确的实现方法

方法1:用Numpy修正你的现有代码

假设你的years是对应每条成交量数据的年份序列,sp_volume是日成交量数组,dates是交易日的datetime64数组,我们可以用np.split配合分割位置来分组求和:

年度求和修正

yearList = [j for j in range(2001,2020)]
yearsplits = np.searchsorted(years, yearList)
# 按年份分割成交量数组,手动加上起始位置0和数组末尾
volume_year_splits = np.split(sp_volume, [0] + yearsplits + [len(sp_volume)])
# 遍历分片,对应2000到2019年
for idx, volume in enumerate(volume_year_splits[:-1]):  # 去掉最后一个空分片
    print(" {}: {:12.0f}".format(2000 + idx, volume.sum()))

月度求和修正

months = dates.astype('datetime64[M]').astype(int)
months -= months[0]  # 从0开始对应2000年1月
# 计算2000-2019年所有月份的分割位置(共20年=240个月)
monthsplits = np.searchsorted(months, range(1, 20*12 + 1))
# 分割成交量数组
volume_month_splits = np.split(sp_volume, monthsplits)
# 遍历每个月度分片,格式化输出
for idx, volume in enumerate(volume_month_splits):
    year = 2000 + idx // 12
    month = idx % 12 + 1
    print("{}年{}月: {:12.0f}".format(year, month, volume.sum()))

方法2:用Pandas更高效(推荐)

如果数据量不是特别大,用Pandas处理时间分组会更直观,几乎不会出错:

import pandas as pd

# 把日期和成交量转换成DataFrame
df = pd.DataFrame({
    'date': dates,
    'volume': sp_volume
})
# 设置日期为索引,方便按时间聚合
df.set_index('date', inplace=True)
# 按月份求和,直接用resample方法
monthly_volume = df.resample('M')['volume'].sum()
# 筛选2000年1月到2019年12月的数据
monthly_volume = monthly_volume.loc['2000-01':'2019-12']
# 打印结果
print(monthly_volume)

内容的提问来源于stack exchange,提问作者cpatton2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:21:44