Pandas .min()无法按周获取正确最低值问题排查
按周提取电力最低值结果异常的排查与解决
问题描述
有一个按每日每小时记录燃气、电力使用量的DataFrame,目标是按周提取最低电力值及对应的日期和小时,但以下两种方法均返回错误结果:
- 使用
groupby分组:
lowestUsage = BusinessUsageDf.groupby([pd.Grouper(level='ts', freq='W-SAT')])['elec'].min()
返回的2022-04-30至2022-05-07周最低值为10.400...,但实际该周最低值应为3.199...
2. 使用resample重采样:
lowestUsageWeekDf = BusinessUsageDf.resample("W").min()
同样未得到正确的最低值。
可能原因
- 时间索引不规范:
- 如果
ts列未设置为DataFrame的索引,或未转换为datetime类型,pd.Grouper(level='ts')会无法正确识别时间维度,导致分组逻辑混乱。 resample默认要求索引为datetime类型,若索引类型错误,重采样的周范围划分会完全偏离预期。
- 如果
- 周频率规则不匹配:
W-SAT表示每周六作为周结束日,而resample("W")默认以每周日为周结束日,这会导致周的划分范围和你预期的2022-04-30至2022-05-07不重叠,分组的数据集错误自然会导致最小值计算偏差。
- 分组范围验证缺失:
仅提取最小值无法确认该值是否属于目标周,可能是分组时错误包含了其他周的数据,或排除了目标周内的部分数据。
解决方法
1. 规范时间索引
先确保时间列的类型和索引设置正确:
# 转换ts列为datetime类型 BusinessUsageDf['ts'] = pd.to_datetime(BusinessUsageDf['ts']) # 将ts设置为DataFrame的索引 BusinessUsageDf = BusinessUsageDf.set_index('ts')
2. 统一周频率规则
如果你的周以周六结束,resample也要使用相同的频率规则,保证分组范围一致:
# 按周六结束的周重采样,计算elec最小值 lowestUsageWeekDf = BusinessUsageDf.resample("W-SAT")['elec'].min()
3. 获取最小值对应的完整记录
为了验证结果并获取对应的日期和小时,使用idxmin()定位最小值的索引,再提取整条记录:
# 按周分组,获取每个周elec最小值的索引 weekly_min_idx = BusinessUsageDf.groupby(pd.Grouper(freq='W-SAT'))['elec'].idxmin() # 提取最小值对应的完整记录(包含日期和小时) weekly_min_records = BusinessUsageDf.loc[weekly_min_idx]
4. 验证分组时间范围
输出每个分组的时间区间,确认是否和预期一致:
groups = BusinessUsageDf.groupby(pd.Grouper(freq='W-SAT')) for week_end, group in groups: print(f"周结束日期: {week_end.date()}") print(f"分组数据时间范围: {group.index.min()} ~ {group.index.max()}") print(f"当前周elec最小值: {group['elec'].min()}\n")
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

