You need to enable JavaScript to run this app. 如何检查datetime索引逐小时DataFrame的连续性与索引错位问题
优惠活动
大模型
产品
解决方案
定价
更多

如何检查datetime索引逐小时DataFrame的连续性与索引错位问题

数据连续性缺陷排查操作
  • 逐小时索引完整性校验
    生成目标年份的理论完整逐小时时间轴,和现有DataFrame的索引做差集比对,直接定位所有缺失、冗余的时间点:
    # 生成2019年全年逐小时的理论完整索引
    full_hourly_idx = pd.date_range('2019-01-01 00:00:00', '2019-12-31 23:00:00', freq='1H')
    # 找出实际索引和理论索引的差异
    missing_time = full_hourly_idx.difference(df19.index)
    redundant_time = df19.index.difference(full_hourly_idx)
    
    若missing_time非空,说明存在数据断档,绘图时matplotlib会默认将断档两端的有效点直接连线,形成无逻辑的飞线,就是异常图的典型表现。
  • 周次分组合理性校验
    按ISO周次分组统计每个周次的记录数和时间范围,排查分组逻辑的错位问题:
    week_stat = df19.groupby('week').agg(
        start_bound=('datetime', 'min'),
        end_bound=('datetime', 'max'),
        total_records=('datetime', 'count')
    )
    
    正常完整一周的逐小时记录数应为168条(7天*24小时),若某周次记录数远低于该值,要么是数据缺失,要么是ISO周的跨年特性导致同数字周的跨年度数据被错误归为一组(比如1月初的周可能被归到上一年的周号下)。
代码逻辑的核心问题定位
  • 画布残留导致的叠图问题
    循环中每次新建绘图对象后未显式关闭,且关闭了max_open_warning的提示,随着绘图数量增加,旧画布的残留线条会和新图的内容叠加,形成完全不规则的叠图效果。
  • 未过滤非数值字段导致的绘图异常
    代码循环遍历df19.columns时,会把提前生成的week、month分类字段作为绘图对象,这两类字段本身是离散整数,绘图后会形成阶梯状的异常曲线,和真实数据的连续时序曲线完全不匹配。
  • 空数据块的无防护绘图
    若某周次筛选后无有效数据,matplotlib会默认将x轴范围设为全表的时间跨度,生成的图会出现极端的范围偏移,看起来完全偏离正常效果。
针对性修复方案
  • 第一步:补全连续时间索引
    用理论完整的时间轴重索引现有数据,给缺失的时间点留空值,让matplotlib自然在断档处断开连线,同时重新计算索引对应的周次、月份字段,避免分组错位:
    df19 = df19.reindex(full_hourly_idx)
    df19.index.name = 'datetime'
    df19['week'] = df19.index.isocalendar().week
    df19['month'] = df19.index.month
    
  • 第二步:修复绘图循环的资源泄漏
    每次绘图完成后显式关闭画布,过滤非数值类字段,跳过无有效数据的周次,同时固定x轴范围为当前周的真实时间跨度,避免范围偏移:
    def graph(field_name):
        # 跳过非数值字段,避免无效绘图
        if field_name in ['week', 'month']:
            return
        for week_id in range(2, 53):
            # 筛选当前周的有效非空数据
            week_data = df19.loc[df19['week'] == week_id, field_name].dropna()
            # 跳过无数据的周次
            if len(week_data) == 0:
                continue
            # 生成对应存储路径
            save_dir = f'mypath/Programmes/Semaines/2019/{field_name}'
            if not os.path.exists(save_dir):
                os.makedirs(save_dir, exist_ok=True)
            # 新建独立画布
            fig, ax = plt.subplots(figsize=[20, 20])
            # 绘制曲线
            ax.plot(week_data.index, week_data.values)
            # 固定x轴范围为当前周的真实时间边界
            ax.set_xlim(week_data.index.min(), week_data.index.max())
            # 保存图片
            save_path = os.path.join(save_dir, f"{field_name}_{week_id}.png")
            plt.savefig(save_path)
            # 显式关闭画布,清除残留
            plt.close(fig)
    
  • 第三步:异常图回溯校验
    遇到效果异常的图表时,直接根据图名对应的字段、周次,导出对应的数据块,检查是否存在离群值、时间错位、跨周混入的问题,定位具体异常点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 23:06:10