如何对日内间隔数据重采样并使用.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
相关产品推荐
相关产品推荐

