Matplotlib绘制GCHP与NOAA数据同子图对比的日期格式报错如何解决
问题根因
你判断的两类数据时间格式不统一是完全正确的。报错的核心原因是你将20180101.0这类YYYYMMDD格式的数值直接传给了Matplotlib的日期坐标轴:Matplotlib内置的日期序数为公元元年到对应日期的累计天数,数值范围仅在-719162 ~ 200000区间,20180101远超出该上限,因此触发范围报错。
修正方案
第一步:统一两类数据的时间格式为
datetime类型- 处理GCHP的nc4数据:用xarray读取文件时开启自动时间解码,输出的时间变量会直接转为
datetime64格式,无需额外处理:
import xarray as xr ds_gchp = xr.open_dataset("你的GCHP文件路径.nc4", decode_times=True)- 处理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" )- 处理GCHP的nc4数据:用xarray读取文件时开启自动时间解码,输出的时间变量会直接转为
第二步:绘图时直接传入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
相关产品推荐
相关产品推荐

