在python中重新填充Netcdf文件

2024-09-29 06:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将NetCDF文件从0.125度空间比例重新划分为0.083度空间比例。netcdf包含224个纬度和464个经度,它有一年的每日数据

我尝试了xarray,但它产生了以下内存错误: MemoryError: Unable to allocate 103. GiB for an array with shape (13858233841,) and data type float64

如何使用python重新命名该文件


Tags: 文件to数据内存错误netcdf比例xarray
3条回答

使用CDO作为后端的Python选项是我的包nctoolkit:https://nctoolkit.readthedocs.io/en/latest/,可通过pip(https://pypi.org/project/nctoolkit/)安装

它有一个名为_latlon的内置方法,该方法将重新生成指定的latlon网格

在您的情况下,您需要执行以下操作:

import nctoolkit as nc

data = nc.open_data(infile)

data.to_latlon(lon = [lon_min, lon_max], lat = [lat_min, lat_max], res = [0.083, 0.083])

最简单的方法是使用CDO、NCO和NCL等操作符

cdo remapbil,target_grid infile.nc ofile.nc

目标gid可以是描述符文件,也可以使用具有所需网格分辨率的NetCDF文件。注意其他可能适合您需要的重新投标方法。上面的示例使用双线性插值

另一个选项是trycf-python,它(通常)可以在球面极坐标和笛卡尔坐标中重新生成大于内存的数据集。它使用ESMF重新填充引擎来完成此操作,因此可以使用线性、一阶和二阶保守、最近邻等重新填充方法

下面是一个您需要的重新投标类型的示例:

import cf
import numpy

f = cf.example_field(2) # Use cf.read to read your own data

print('Source field:')
print(f)

# Define the output grid
lat = cf.DimensionCoordinate(
           data=cf.Data(numpy.arange(-90, 90.01, 0.083), 'degreesN'))
lon = cf.DimensionCoordinate(
          data=cf.Data(numpy.arange(0, 360, 0.083), 'degreesE'))

# Regrid the field
g = f.regrids({'latitude': lat, 'longitude': lon}, method='linear')

print('\nRegridded field:')
print(g)

产生:

Source field:
Field: air_potential_temperature (ncvar%air_potential_temperature)
------------------------------------------------------------------
Data            : air_potential_temperature(time(36), latitude(5), longitude(8)) K
Cell methods    : area: mean
Dimension coords: time(36) = [1959-12-16 12:00:00, ..., 1962-11-16 00:00:00]
                : latitude(5) = [-75.0, ..., 75.0] degrees_north
                : longitude(8) = [22.5, ..., 337.5] degrees_east
                : air_pressure(1) = [850.0] hPa

Regridded field:
Field: air_potential_temperature (ncvar%air_potential_temperature)
------------------------------------------------------------------
Data            : air_potential_temperature(time(36), latitude(2169), longitude(4338)) K
Cell methods    : area: mean
Dimension coords: time(36) = [1959-12-16 12:00:00, ..., 1962-11-16 00:00:00]
                : latitude(2169) = [-90.0, ..., 89.94399999999655] degreesN
                : longitude(4338) = [0.0, ..., 359.971] degreesE
                : air_pressure(1) = [850.0] hPa

有很多选项可以从其他字段获取目标网格,也可以显式定义目标网格。更多详细信息请参见in the documentation

cf-python将从附加到数据集的cf元数据推断出哪些轴是X和Y,等等,但是如果缺少这些轴,那么总是有办法手动设置或解决这些轴

相关问题 更多 >