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

Matplotlib绘制GCHP与NOAA数据同子图对比的日期格式报错如何解决

问题根因

你判断的两类数据时间格式不统一是完全正确的。报错的核心原因是你将20180101.0这类YYYYMMDD格式的数值直接传给了Matplotlib的日期坐标轴:Matplotlib内置的日期序数为公元元年到对应日期的累计天数,数值范围仅在-719162 ~ 200000区间,20180101远超出该上限,因此触发范围报错。

修正方案

  • 第一步:统一两类数据的时间格式为datetime类型

    1. 处理GCHP的nc4数据:用xarray读取文件时开启自动时间解码,输出的时间变量会直接转为datetime64格式,无需额外处理:
    import xarray as xr
    ds_gchp = xr.open_dataset("你的GCHP文件路径.nc4", decode_times=True)
    
    1. 处理NOAA的十进制日期decdate:根据你使用的十进制格式选对应转换代码:
    import pandas as pd
    # 读入NOAA csv数据
    noaa_df = pd.read_csv("你的NOAA文件路径.csv")
    
    # 情况1:decdate为YYYY.DOY格式(例如2018.001代表2018年第1天)
    noaa_df["datetime"] = pd.to_datetime(
        noaa_df["decdate"].apply(lambda x: f"{int(x)}-{int((x%1)*365 + 1)}"),
        format="%Y-%j"
    )
    
    # 情况2:decdate为数值型YYYYMMDD格式(例如20180101.0)
    noaa_df["datetime"] = pd.to_datetime(
        noaa_df["decdate"].astype(int).astype(str),
        format="%Y%m%d"
    )
    
  • 第二步:绘图时直接传入datetime类型数据

    不要把日期转成数值传参,直接将处理好的datetime列作为x轴输入,Matplotlib会自动识别日期格式:
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    fig, ax = plt.subplots(figsize=(12, 6))
    # 绘制GCHP模拟结果
    ax.plot(ds_gchp.time, ds_gchp["你要对比的变量名"], label="GCHP模拟")
    # 绘制NOAA观测数据
    ax.scatter(noaa_df["datetime"], noaa_df["你要对比的观测变量名"], color="C1", label="NOAA观测")
    
    # 可选:自定义x轴日期显示格式
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m"))
    fig.autofmt_xdate() # 自动旋转日期标签避免重叠
    ax.legend()
    plt.show()
    
  • 避坑提示

    任何时候不要手动把日期转成YYYYMMDD格式的整数/浮点数传入Matplotlib日期坐标轴,统一转换为datetime/datetime64类型是最稳妥的方案,完全可以避免日期范围报错问题。

内容的提问来源于stack exchange,提问作者Jordan-Yousef Jbour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:06:03