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

使用Pandas Grouper分组后出现超出过滤时间范围的空时间仓问题

解决分组后出现超出时段的NaN分组问题

我处理的是仅包含09:30至16:00时间戳的5分钟级数据(Datetime为列而非索引),使用pd.Grouper按30分钟分组后,结果出现了16:00之后的空分组(显示NaN),但原始数据中并无该时段数据,需要移除所有超出09:00至16:00时间范围的数据。

原始代码问题

filtered = self.df.groupby(pd.Grouper(key = 'Datetime', freq = '30min', origin = 'start'))
self.other_df['Avg_volatility'] = filtered['volatility'].mean()

解决方案

方法1:分组后过滤时间范围

先完成分组计算,再通过索引的时间部分筛选出符合09:00-16:00范围的分组:

# 分组计算波动率均值
vol_mean = self.df.groupby(pd.Grouper(key='Datetime', freq='30min', origin='start'))['volatility'].mean()
# 筛选时间范围,仅保留09:00到16:00之间的分组
self.other_df = vol_mean[vol_mean.index.time.between(pd.Timestamp('09:00').time(), pd.Timestamp('16:00').time())].to_frame('Avg_volatility')

方法2:先过滤原始数据再分组

从源头限制数据的时间范围,再进行分组操作,避免生成超出时段的空分组:

# 筛选原始数据中时间在09:00-16:00之间的行
time_mask = self.df['Datetime'].dt.time.between(pd.Timestamp('09:00').time(), pd.Timestamp('16:00').time())
filtered_data = self.df[time_mask]
# 对过滤后的数据分组计算
vol_mean = filtered_data.groupby(pd.Grouper(key='Datetime', freq='30min', origin='start'))['volatility'].mean()
self.other_df = vol_mean.to_frame('Avg_volatility')

补充说明

  • 方法1适合已经完成分组操作后,需要快速清理结果的场景;
  • 方法2从数据源头控制范围,减少不必要的分组计算,效率更高;
  • 若想避免生成16:00这个空分组,可结合closed='left'参数调整分组边界,但仍建议搭配时间过滤确保结果准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:05:14