窃格瓦拉·瓶:学Linux是不可能学Linux的,这辈子都不可能喜欢命令行的,Win10说话又好听,我偷别人代码养你啊(?)
总之就是提不起兴趣学Linux,但是组里的绝大部分数据都是grib格式的,为了让自己能在Win10的溺爱下多摸鱼一会,只能想个办法找个借口了。
感谢来自英俊的Sonic师兄的帮助,以及网络上曾经写过相关教程的大佬们,参考链接见后。
我的情况:Windows10专业版,使用了Anaconda安装、管理相关的包,编译器则选择了JupyterLab。
下面介绍一下我的方法。
根据参考链接[1],最简单的方法就是利用xarray和cfgrib来打开grib文件了。文中提到要首先安装ECcodes这个包,还介绍了离线安装的步骤,我试了很多个eccodes的版本,尽管离线安装成功,但是在后续过程中仍然会报错:
如果直接安装eccodes,不是和上图里一样报了的错误,就是环境配置一直loading,最后帮我把所有安装的包都更新了一遍……
(说到这个真的把我气坏了,我刚开始根本不知道它在更新包,只看到整个屏幕都是进度条,我既不知道怎么暂停进程,又不敢直接关掉电脑,只能把电脑盖子合上物理断网……)
考虑到eccodes是cfgrib的依赖包,如果要安装cfgrib的话应该会自动帮我把eccodes也装了吧?于是我尝试直接安装cfgrib,确实没有报unknown的错误了,但是Solving environment又出问题了:
实在等不下去了,按了暂停
所以到底应该怎么办?
根据参考链接[2]以及Sonic师兄的谆谆教导,我得知了在 (base) 环境下安装包很容易冲突,因此可以像[2]中所说的,在 (base) 下输入以下代码,即可新建一个虚拟环境以安装cfgrib:
conda create -n cfgrib_env python=3.7.0
其中cfgrib_env是环境名称,可以修改为自己喜欢的名字;而python=(版本号)也可以改为自己需要的版本,此时我们就有了一个新的、版本为3.7.0的Python环境。
然后输入以下代码启动刚刚设定好的虚拟环境:
activate cfgrib_env
这个时候 (base) 就会变成 (cfgrib_env) 。但是,我们之前装好的xarray、cartopy是在 (base) 环境中安装的,于是要在激活了cfgrib_env的环境下,利用conda install ~~的命令,重新在新环境下进行安装我们需要的包——不要忘了装cfgrib哦。
搞了这么多东西,总应该能读取grib文件了吧?
但是,我们的编译器所处环境更新了吗?事实证明没有,我还是没有办法在编译器里import cfgrib。这个时候就要用到参考链接[3]和[4]的办法了。
ps. 也可参考链接
在 (base) 下安装anaconda的NB插件:
conda install nb_conda
然后,切换到新的环境(如cfgrib_env)中,安装Jupyter:
pip install jupyter
完成这两个步骤后,就会发现这个nb_conda到底有多nb了:这个插件可以让我们在JupyterLab里很方便的切换需要的环境——在打开代码前利用下拉菜单选择即可。
好了,让我们写代码验证一下是不是真的能打开grib文件并提取数据来画图吧!
import xarray as xr
import numpy as np
import cfgrib
import matplotlib.pyplot as plt
import xarray as xr
import cartopy.crs as ccrs
import cartopy.feature as cfeat
from cartopy.io.shapereader import Reader
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
file = 'G:/temp20090410.grib'
obj = xr.open_dataset(file, engine='cfgrib')
t2m = obj['t2m']-273.15
t2m.attrs['units'] = 'degree C'
proj = ccrs.PlateCarree()
fig = plt.figure(figsize=(9,6),dpi=150)
ax = fig.subplots(1, 1, subplot_kw={'projection':proj})
ax.add_feature(cfeat.COASTLINE, linewidth=0.6, zorder=1)
t2m.plot.contourf(ax=ax,levels=np.arange(-40,35,5), cmap='Spectral_r', transform=ccrs.PlateCarree())
ax.set_title('2020年9月4日10时(世界时)地面两米气温')
fig.show
fig.savefig('0904test', bbox_inches='tight')
确实是可以出图的(难掩激动):
最后,让我们大声喊一句Python永远滴神吧!(?)
谢谢你的阅读!
参考
- ^[1] https://www.jianshu.com/p/683d3bb5b3cd
- ^[2] https://zhuanlan.zhihu.com/p/139776843