我正在尝试将天气文件从 grib 转换为 netcdf,然后缩小这些文件覆盖的区域。
dsgrib = xr.open_dataset("infile", engine = "cfgrib")
dsgrib.to_netcdf("outfile.nc)
转换本身有效。但是,如果我尝试减少 netcdf 文件中的面积,我要么会丢失变量,要么会丢失纬度和经度值。
ds = xr.open_dataset("outfile.nc")
ds = ds.sel(lon=slice(lonmin, lonmax), lat=slice(latmin, latmax))
ds.to_netcdf("newarea.nc")
但是当我尝试从命令行使用 cdo 查看文件的竞争时
cdo sinfon newarea.nc
我收到以下错误:
subset.to_netcdf("new.nc")
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/core/dataset.py", line 1912, in to_netcdf
return to_netcdf( # type: ignore # mypy cannot resolve the overloads:(
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/backends/api.py", line 1232, in to_netcdf
dump_to_store(
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/backends/api.py", line 1279, in dump_to_store
store.store(variables, attrs, check_encoding, writer, unlimited_dims=unlimited_dims)
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/backends/common.py", line 270, in store
self.set_variables(
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/backends/common.py", line 308, in set_variables
target, source = self.prepare_variable(
File "/home/guest/Desktop/MetOcean/dev3.8/lib/python3.8/site-packages/xarray/backends/netCDF4_.py", line 488, in prepare_variable
nc4_var = self.ds.createVariable(
File "src/netCDF4/_netCDF4.pyx", line 2962, in netCDF4._netCDF4.Dataset.createVariable
File "src/netCDF4/_netCDF4.pyx", line 4299, in netCDF4._netCDF4.Variable.__init__
File "src/netCDF4/_netCDF4.pyx", line 2029, in netCDF4._netCDF4._ensure_nc_success
RuntimeError: NetCDF: Invalid argument
我也尝试过在将 grib 文件转换为 netcdf 文件之前选择初始状态下的区域,并收到以下错误
> Warning (cdf_check_variables): Number of time steps undefined, skipped
> variable u10! Warning (cdf_check_variables): Number of time steps
> undefined, skipped variable v10! Warning (cdfInqContents): No data
> arrays found!
这不是一个 xarray 解决方案,但如果您愿意,您可以使用 cdo 包 在一行中完成此操作:
from cdo import Cdo
cdo=Cdo()
cdo.sellonlatbox(lonmin,lonmax,latmin,latmax,input="in.grb",output="out.nc",options="-f nc4"
)