如何检查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周次分组统计每个周次的记录数和时间范围,排查分组逻辑的错位问题:
正常完整一周的逐小时记录数应为168条(7天*24小时),若某周次记录数远低于该值,要么是数据缺失,要么是ISO周的跨年特性导致同数字周的跨年度数据被错误归为一组(比如1月初的周可能被归到上一年的周号下)。week_stat = df19.groupby('week').agg( start_bound=('datetime', 'min'), end_bound=('datetime', 'max'), total_records=('datetime', 'count') )
代码逻辑的核心问题定位
- 画布残留导致的叠图问题
循环中每次新建绘图对象后未显式关闭,且关闭了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
相关产品推荐
相关产品推荐

