matplotlib和datetime的问题



我试图使用matplotlib绘制时间序列参数的观测和计算值。观察到的数据存储在XL文件中,我使用openpyxl读取并转换为pandas dataframe。模拟值读取为经过的天数,我使用

将其转换为numpy datetime
delt = get_simulated_time()               
t0 = np.datetime64('2004-01-01T00:00:00')
tsim = t0 + np.asarray(delt).astype('timedelta64[D]')
我使用以下代码片段 绘制数据
df = obs_data_df.query("block=='blk-7'")
pobs = df['pres']
tobs = df['date'] 
tobs = np.array(tobs, dtype='datetime64')
print(type(tobs), np.min(tobs), np.max(tobs))
axs.plot(tobs, pobs, '.', color='g', label='blk-7, obs', markersize=8)
tsim = np.array(curr_sim_obj.tsim, dtype='datetime64')
print(type(tsim), np.min(tsim), np.max(tsim))
axs.plot(tsim, curr_sim_obj.psim[:, 0], '-', color='g', label='blk-7, sim', linewidth=1)

打印语句的结果是:

print(type(tobs), np.min(tobs), np.max(tobs))
... <class 'numpy.ndarray'> 2004-06-01T00:00:00.000000000 2020-06-01T00:00:00.000000000
print(type(tsim), np.min(tsim), np.max(tsim))
... <class 'numpy.ndarray'> 2004-01-01T00:00:00 2020-07-20T00:00:00

这些类型看起来不错,但我从matplotlib得到这个错误消息:ValueError: view limit minimum -36907.706903627106 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units我不明白为什么我得到这个消息,因为打印语句表明数据是一致的。我尝试使用

进一步调查。
print(np.dtype(tsim), np.min(tobs), np.max(tobs))

但是得到这个错误信息:

TypeError: data type not understood

这让我更加困惑,因为我在前面的语句中设置了tobs数据类型。我不得不说,我对python、pandas和numpy处理日期的方式的差异感到非常困惑,上面的各种代码拼凑反映了我在此过程中找到的变通方法。我基本上想知道如何在同一图上绘制两个不同的时间序列,所以非常欢迎所有建议。提前感谢!

更新:在减少代码以获得重现错误的更简单的情况时,我发现下面的代码隐藏在绘图例程中:axs.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')这是测试情节程序时留下的。一旦我删除这个错误就消失了。我想我需要更仔细地检查我的代码…

解决方案是对两组数据使用matplotlib.dates.num2date函数。

最新更新