首页 > 解决方案 > 如何从 NETcdf 时间维度存储月份(0 对应于 jan)?

问题描述

我有一个 3d NETcdf 数据集,正在尝试使用降水变量。我想绘制 60 年来的每月平均值,但很难生成与我之前没有涉及 for 循环的平均计算一致的图。以下是我如何存储 1 月、2 月的值并取平均值:

janNES = np.empty_like(conprecip[0:720,6:-11,95:141])

for i in range(0,720,12):
     janNES[i]=(NESprecip[i,6:-11,95:141])          

mjanNES=(np.mean(janNES, axis=0))

febNES = np.empty_like(conprecip[0:720,6:-11,95:141])

for i in range(1,720,12):
     febNES[i]=(NESprecip[i,6:-11,95:141]) 

mfebNES=(np.mean(febNES, axis=0))

#values that are plotted, monthly 60 year averages
np.mean(mjanNES-mjan)
np.mean(mfebNES-mfeb)

其中 0-11 是一月到十二月,所以我类似地存储其他月份的值。我相信我存储数据的方式有问题,因为在减去控件(mjan 和 mfeb,使用此方法存储)并再次取平均值后,它会产生奇怪的结果。感谢您的阅读和帮助。

标签: pythonnetcdfnetcdf4

解决方案


数组的第一个维度的大小janNES是 720,但是当你随着时间的推移循环时:

for i in range(0,720,12):
    janNES[i]=...

您只填充每 12 个 ( 0,12,24,...) 项,但最终取整个数组的平均值。您可能希望将数组创建为:

janNES = np.empty_like(conprecip[0:720:12,6:-11,95:141])

然后用例如循环遍历它:

for ii,i in enumerate(range(0,720,12)):
    janNES[ii]=(NESprecip[i,6:-11,95:141])

ii现在从运行,0,1,2,..,59i从运行0,12,24,..,708


顺便说一句,您不需要for循环,Numpy 可以通过切片原始数组直接选择数据:

janNES = NESprecip[0:720:12, 6:-11, 95:141]
febNES = NESprecip[1:720:12, 6:-11, 95:141]

您甚至可以直接从中计算平均值:

mjanNES = NESprecip[0:720:12, 6:-11, 95:141].mean(axis=0)

推荐阅读