使用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
相关产品推荐
相关产品推荐

