这次使用的数据是网格数据,netCDF老演员了,使用了两个数据,分别是PM2.5和气温TEM,对二者先进行相关性分析,然后分别进行MK分析,并且为了防止遇到nan和inf值,在自定义函数中进行了限制,应该适用性还是可以的,应该可以很方便地用于自己的数据集中。
首先读取两个数据集,由于网格较多,这里只选择一小部分来执行,在选择制定范围数据的时候,使用isel趋选择,不要用sel,在我用sel去选择数据的时候发现lat显示是0。

接下来对PM2.5和TEM数据进行相关性分析:
from scipy import stats
def corr_3d(x,y):
nlat=y.shape[1]
nlon=y.shape[2]
corr=np.full([nlat,nlon],np.nan)
pval=np.full([nlat,nlon],np.nan)
for i in range(nlat):
for j in range(nlon):
t_x = np.isnan(x[:,i,j])
t_y = np.isnan(y[:,i,j])
if True in t_x or True in t_y:
continue
else:
r,p=stats.pearsonr(x[:,i,j],y[:,i,j])
corr[i,j]=r
pval[i,j]=p
lat = y.coords['lat']
lon = y.coords['lon']
corr=xr.DataArray(corr,coords=[lat,lon],dims=['latitude','longitude'])
pval=xr.DataArray(pval,coords=[lat,lon],dims=['latitude','longitude'])
return corr,pval
corr,pval=corr_3d(PM25,TEM['tmp'])
然后绘制出相关系数图

第二部分是分别对PM2.5和TEM数据进行MK趋势分析,只需要简单修改一下上述定义好的函数即可使用

然后绘制出来看看,由于数据是每月的,因此slope那里乘了12表示年的趋势,绘图结果如下

同样的,对TEM气温数据也进行MK测试,slope乘了120表示十年的趋势,TEM的趋势数值没想到这么大

在具体的使用中,如果网格较大的话运行可能比较慢。
申根区牛逼!过几天就去维也纳参加EGU2023啦!
A)联系小编获取原价100刀的谢尚平新书电子版《海气耦合动力学:从厄尔尼诺到气候变化》 & 公众号不定期送书活动
B)提前联系号主委托录制所需报告 & 公众号主页右上角放大镜即可搜索往期上万录屏
C)中国气象背景数据集(点击蓝字跳转)
D)全国气象局、民航空管、考研升学等面试真题
E)Python、Linux、Endnote、Fortran等干货专题(菜单栏)
F)头条免费宣传课题组科研进展,旨在促进学科交流,欢迎供稿!