
本文介绍如何通过正确填充时间索引并插入 nan 值,确保 matplotlib 仅绘制逻辑连续的温度数据段,避免跨多日缺失期的异常连线。
本文介绍如何通过正确填充时间索引并插入 nan 值,确保 matplotlib 仅绘制逻辑连续的温度数据段,避免跨多日缺失期的异常连线。
在使用 Matplotlib 绘制长时间跨度(如整月)的温度时间序列时,一个常见却易被忽视的问题是:即使存在数天甚至更久的连续缺失数据,Matplotlib 仍可能将前后两段有效数据强行连接起来,造成误导性趋势线。根本原因在于:Matplotlib 默认按数组索引顺序连线,只要两个有效数据点之间没有 NaN,它就会画线——而不会考虑它们在真实时间轴上的间隔。
要彻底解决该问题,关键不是“分天绘图”(会导致图例爆炸),而是构建一个完整、等间隔、带显式 NaN 的时间基准索引,让缺失时段在数据结构层面被明确标识。
✅ 正确做法:重采样为小时级等距时间序列
假设你的原始 DataFrame month_year_data 已以 datetime 为索引(如 2023-10-01 00:00:00, 2023-10-01 01:00:00…),但中间存在整日缺失(例如 10/21–10/28 完全无记录)。此时应执行:
import pandas as pd
# 生成覆盖全月每小时的完整时间索引(频率='H')
full_hourly_index = pd.date_range(
start=month_year_data.index.min(),
end=month_year_data.index.max(),
freq='H'
)
# 用 reindex 强制对齐:缺失时间点自动填充 NaN
month_year_data_filled = month_year_data.reindex(full_hourly_index)reindex() 会自动将原始数据映射到新索引上,所有未覆盖的时间点(即原数据中缺失的小时)均被设为 NaN —— 这正是 Matplotlib 断开连线所需的信号。
? 绘图代码优化(保持单图单图例)
替换原绘图循环中的数据源即可:
fig, ax = plt.subplots(figsize=(20, 10))
zones = ['Far range', 'Mid range', 'Near range']
colors = ['blue', 'green', 'red']
for i, zone in enumerate(zones):
# 使用已填充 NaN 的完整时间序列
ax.plot(
month_year_data_filled.index,
month_year_data_filled[zone],
label=zone,
color=colors[i],
linestyle='-',
linewidth=1.2
)
ax.set_xlabel('Time (UTC)')
ax.set_ylabel('Temperature (°C)')
ax.set_title(f'Temperature by Hour — {month_name}-{year}')
ax.tick_params(axis='x', rotation=45)
ax.grid(True, alpha=0.3)
ax.legend()
plt.tight_layout()
plt.show()✅ 效果:所有跨越 NaN 区域的连线将自动中断,例如 10/20 23:00 与 10/29 00:00 不再相连;仅同一连续数据段内(如 10/01 00:00–10/05 12:00)才会形成连贯曲线。
⚠️ 注意事项
- 务必确认原始索引为 datetime64 类型:运行 print(month_year_data.index.dtype),若非 datetime64[ns],需先执行 month_year_data.index = pd.to_datetime(month_year_data.index)。
- 避免 resample().mean() 等聚合操作:本方案目标是保真插空,而非降频或插值;聚合会掩盖缺失事实,且无法解决断线问题。
- 内存考量:对超长周期(如多年小时数据),date_range 生成大量索引可能占用内存,可分段处理或改用 asfreq('H')(效果类似,但更轻量)。
- 验证填充结果:建议检查 month_year_data_filled.isna().sum(),确认缺失小时数符合预期。
通过这一标准化时间索引 + 显式 NaN 的组合策略,你既能维持单图清晰表达,又能严格遵循时间序列的物理连续性逻辑——这才是专业气象/物联网时序可视化的可靠基础。

















