首页 > 解决方案 > 如何循环 NetCDF 时间序列

问题描述

我有一些 NetCDF 时间序列数据。通过读取变量,我想列出每个数据的全局平均值。我编写了有效的代码,但它并不性感。如何以更好的形式编写(循环)此代码?

variables = 'name1 name2 name3 name4'.split()
name1  =[]
name2  =[]
name3  =[]
name4  =[]

for i in range (9,40):
    name1_irrY = name1_aSrc[i].mean()
    name1.append(name1_irrY)
    name2_irrY = name2_aSrc[i].mean()
    name2.append(name2_irrY)
    name3_irrY = name3_aSrc[i].mean()
    name3.append(name3_irrY)
    name4_irrY = name4_aSrc[i].mean()
    sname4.append(name4_irrY)

"name"_aSrc[i,:,:]是 NetCDF 的变量。

因为我有很多文件,所以我需要足够的方法。

标签: pythonloopsnetcdf4

解决方案


我认为您根本不需要循环,因为您可以指定要沿哪个轴计算平均值。所以这样的事情就足够了(这将替换您发布的整个代码块):

name1 = np.mean(name1_aSrc[9:40,:,:], axis=(1,2))
name2 = np.mean(name2_aSrc[9:40,:,:], axis=(1,2))
# etc..

一个小例子,其中包含我周围的一些 NetCDF 数据:

import xarray as xr
import numpy as np

f = xr.open_dataset('u.xz.nc', decode_times=False)
u = f['u'].values

print(u.shape)  # prints: (5, 96, 128, 1)

umean = np.mean(u, axis=(1,2,3))

print(umean.shape) # prints: (5,)

另一种解决方案是让 xarray 计算(命名)维度或多个维度的平均值。一些其他数据的快速示例:

import xarray as xr
import numpy as np

f = xr.open_dataset('drycblles_default_0000000.nc', decode_times=False)

# Original file has 3 dimensions:
print(f.dims)   # prints Frozen(SortedKeysDict({'time': 37, 'z': 32, 'zh': 33}))

# Calculate mean over one single dimension:
fm1 = f.mean(dim='z')
print(fm1.dims)  # prints Frozen(SortedKeysDict(OrderedDict([('time', 37), ('zh', 33)])))

# Calculate mean over multiple dimensions:
fm2 = f.mean(dim=['z','zh'])
print(fm2.dims)  # prints Frozen(SortedKeysDict(OrderedDict([('time', 37)])))

fm1fm2是简单的 xarray 数据集:

<xarray.Dataset>
Dimensions:  (time: 37)
Coordinates:
  * time     (time) float64 0.0 300.0 600.0 900.0 ... 1.02e+04 1.05e+04 1.08e+04
Data variables:
    iter     (time) float64 0.0 5.0 10.0 15.0 20.0 ... 282.0 293.0 305.0 317.0
    area     (time) float64 1.0 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0 1.0 1.0
    areah    (time) float64 1.0 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0 1.0 1.0
    th       (time) float64 304.8 304.8 304.8 304.8 ... 305.1 305.1 305.1 305.1
    th_3     (time) float64 1.246e-08 -3.435e-11 ... 7.017e-06 5.548e-05    

推荐阅读