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

如何对日内间隔数据重采样并使用.idxmax()获取每日成交量最高值索引

报错原因

  • 你用"B"(工作日)重采样时,只会排除周末,不会排除元旦、独立日这类法定节假日,这些节假日对应的重采样bin没有任何数据,是空序列,idxmax()处理空序列时就会触发报错。
  • .max()能正常运行是因为pandas内置的聚合函数对空分组默认返回NaN,做了异常兼容,而idxmax()没有做这类空值兼容。
  • 你之前写的自定义agg报错,是因为空分组返回了np.nan(浮点型空值),而idxmax()返回的是时间戳类型,类型不匹配在部分pandas版本会触发索引边界错误,需要用时间类型专属的空值pd.NaT代替np.nan。

解决方案

你可以用如下两种写法解决,兼容空分组的情况:

写法1(简洁版,适配pandas 1.3+版本)

# 空分组返回时间类型空值pd.NaT,避免类型冲突
res = df.resample("B")["Volume"].apply(lambda x: x.idxmax() if not x.empty else pd.NaT)

如果不需要保留没有数据的工作日行,可以最后加.dropna()删掉空值:

res = df.resample("B")["Volume"].apply(lambda x: x.idxmax() if not x.empty else pd.NaT).dropna()

写法2(兼容旧版本pandas,性能更好)

如果你数据量很大,可以用分组过滤的方式避免空分组处理:

import pandas as pd
# 按工作日分组
grouper = pd.Grouper(freq="B")
# 先过滤掉没有数据的空分组,再计算idxmax
valid_dates = df.groupby(grouper)["Volume"].count().loc[lambda x: x>0].index
res = df[df.index.floor("B").isin(valid_dates)].groupby(grouper)["Volume"].idxmax()

验证方法

你可以先执行df.resample("B").size()查看所有重采样分组的行数,就能看到哪些工作日是没有数据的空bin,对应就是你数据覆盖时段里的法定节假日。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:36:02