繁体   English   中英

NetCDF 重新网格化的问题,python

[英]Problems with NetCDF regridding, python

大家好,这是我在这里的第一个问题^^

我需要重新整理一些 NetCDF 文件,所以我尝试使用 cdo 和 cf 模块来完成它,但是一切都失败了。 也许有人为此目的知道一些其他模块,或者可以帮助我摆脱错误。 首先,我试过 cf:

df = cf.read('my_file.nc')[0]

#define new grid
lat1 = cf.DimensionCoordinate(data=cf.Data(np.arange(-90, 90.01, 0.1), 'degreesN'))
lon1 = cf.DimensionCoordinate(data=cf.Data(np.arange(-180, 180.01, 0.1), 'degreesE'))

#regrid
g = df.regrids({'lat': lat1, 'lon': lon1}, method='linear')

但它给了我:“运行时错误:除非安装了 ESMF 库,否则重新网格化方法将不起作用”。 而且我不知道如何将它安装到我正在处理的远程服务器上。

然后我试过 cdo:

#define input and output files
infile='my_file.nc'
outfile='newgrid.nc' 

#file with needed grid parameters 
gridfile='gridfile.txt'

#bilinear regrid
cdo.remapbil('gridfile.txt', input=infile, output=outfile)

它给了我:“...... STDERR:错误(cdf_load_bounds):134369280000字节的分配失败。[第2048行文件stream_cdf_i.c]系统错误消息:无法分配内存”

我的文件大约 2 gb,这个操作需要 134 gb 怎么办?

我也试过 xarray:

da_input = xarray.open_dataarray('my_file.nc') # the file the data will be loaded from
regrid_axis = np.arange(-90, 90, 0.1) # new coordinates
da_output = da_input.interp(latitude=regrid_axis) # specify calculation
da_output.to_netcdf('output.nc') # save direct to file

它有效,但我想它只是在笛卡尔平面上进行插值,我需要它在球面上。

提前谢谢大家

您可以尝试使用 nctoolkit 来解决这个问题,它使用 CDO 作为后端:

import nctoolkit as nc
ds = nc.open_data("my_file.nc")
ds.to_latlon(lon = [-180, 180], lat = [-90, 90], res = 0.1)
ds.to_nc("output.nc")

如果您的文件是 2 GB,那么您的 CDO 示例中的网格文件可能有误。 它不应该尝试分配那么多 RAM。 nctoolkit 将为您生成适当的 CDO 网格文件和命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM