python - matplotlib 和日期时间的问题
问题描述
我正在尝试使用 绘制时间序列参数的观察值和计算值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 处理日期的方式的差异以及上面的各种代码 kludges 反映了我在此过程中获得的解决方法感到非常困惑。我基本上想知道如何在同一个图上绘制两个不同的时间序列,所以非常欢迎所有建议。先感谢您!
更新:
在削减代码以获得重现错误的更简单案例时,我发现以下代码隐藏在绘图例程中:
axs.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
这是测试绘图例程时遗留下来的。一旦我删除它,错误就消失了。我想我需要更仔细地检查我的代码......
解决方案
matplotlib.dates.num2date
解决方案是在两组数据上使用该函数。
推荐阅读
- email - 如何使用 GMAIL API 将标题“收件人和回复”添加到已生成的草稿中
- excel - VBA 的 OAUTH 问题不会发布 grant_type
- ios - 发出多个异步请求但只等待一个
- php - 通过表达式在 SQL 语句中动态设置参数
- sql-server - SQL Server 表中的 VBA 更新列,其中包含来自 excel 的数据
- java - Java打印出抛出的异常和没有异常抛出不同的地方
- python - 使用列索引数组索引 2D numpy 数组
- spring-boot - 以编程方式查找 Eureka 服务器主机和端口
- php - 使用选择下拉选项 Laravel 生成 ?filter[color]=2&filter[brand]=apple 等 url 参数
- serial-port - RS232 从 Linux SBC 到 Windows PC