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

Pandas .min()无法按周获取正确最低值问题排查

按周提取电力最低值结果异常的排查与解决

问题描述

有一个按每日每小时记录燃气、电力使用量的DataFrame,目标是按周提取最低电力值及对应的日期和小时,但以下两种方法均返回错误结果:

  1. 使用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()

同样未得到正确的最低值。

可能原因

  1. 时间索引不规范:
    • 如果ts列未设置为DataFrame的索引,或未转换为datetime类型,pd.Grouper(level='ts')会无法正确识别时间维度,导致分组逻辑混乱。
    • resample默认要求索引为datetime类型,若索引类型错误,重采样的周范围划分会完全偏离预期。
  2. 周频率规则不匹配:
    • W-SAT表示每周六作为周结束日,而resample("W")默认以每周日为周结束日,这会导致周的划分范围和你预期的2022-04-30至2022-05-07不重叠,分组的数据集错误自然会导致最小值计算偏差。
  3. 分组范围验证缺失:
    仅提取最小值无法确认该值是否属于目标周,可能是分组时错误包含了其他周的数据,或排除了目标周内的部分数据。

解决方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:55:23