xarray - 无法序列化坐标
xarray - cannot serialize coordinates
我正在尝试使用 xarray 追加和写入 netCDF 文件。下面是原始文件的一些信息。
Dimensions: (Time: 744, south_north: 289, west_east: 339)
Coordinates:
XLAT (Time, south_north, west_east) float32 ...
XLONG (Time, south_north, west_east) float32 ...
Dimensions without coordinates: Time, south_north, west_east
Data variables:
Times (Time) |S19 ...
RAINNC (Time, south_north, west_east) float32 ...
I_RAINNC (Time, south_north, west_east) int32 ...
SNOWNC (Time, south_north, west_east) float32 ...
GRAUPELNC (Time, south_north, west_east) float32 ...
HAILNC (Time, south_north, west_east) float32 ...
这是附加文件的一些信息(添加了两个变量)。
Dimensions: (Time: 744, south_north: 289, west_east: 339)
Coordinates:
XLAT (Time, south_north, west_east) float32 ...
XLONG (Time, south_north, west_east) float32 ...
Dimensions without coordinates: Time, south_north, west_east
Data variables:
Times (Time) |S19 ...
RAINNC (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
I_RAINNC (Time, south_north, west_east) int32 0 0 0 0 0 0 0 0 0 0 0 0
SNOWNC (Time, south_north, west_east) float32 ...
GRAUPELNC (Time, south_north, west_east) float32 ...
HAILNC (Time, south_north, west_east) float32 ...
PRCP (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
CUMPRCP (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
我正在尝试使用 xarray.to_netcdf() 写入新文件,但收到此错误:
ValueError: cannot serialize coordinates because variable RAINNC
already has an attribute 'coordinates'
关于如何解决此错误的任何想法?
编辑:
数据是通过天气和研究预报模型 (WRF) 生成的。默认情况下,通过 open_dataset() 使用 decode_cf 加载数据。两个文件的 RAINNC 属性相同,如下所列。
OrderedDict([('FieldType', 104),
('MemoryOrder', 'XY '),
('description', 'ACCUMULATED TOTAL GRID SCALE PRECIPITATION'),
('units', 'mm'),
('stagger', ''),
('coordinates', 'XLONG XLAT XTIME')])
您是如何加载第一个 xarray.Dataset
的? RAINNC
变量、(1) 在 netCDF 文件中、(2) 在加载 xarray 的原始数据集中和 (3) 在组合数据集中有哪些属性?
此错误消息告诉您 RAINNC
在您的组合数据集中有一个 'coordinates'
属性。 Xarray 引发错误,因为它使用 'coordinates'
属性(根据 CF 约定)将坐标(在您的情况下为 XLAT
和 XLONG
)保存到 netCDF 文件。但是,如果存在预先存在的 'coordinates'
属性,它不会这样做,以避免覆盖现有数据。
通常不会出现这种情况,因为当变量添加到 xarray 数据模型中的 coords
时,磁盘上 netCDF 文件中预先存在的 'coordinates'
属性会被删除。但是,如果您将 xarray.open_dataset()
与 decode_cf=False
一起使用,或者如果使用某种手动逻辑来创建数据集,则可能会出现这种情况。
一个简单的解决方法是从组合数据集中的数据变量中删除任何 'coordinates'
属性(例如,del ds['RAINNC'].attrs['coordinates']
),但您绝对应该首先查看这些值,以便确保您没有删除重要的元数据。
我 运行 遇到了与 WRF 文件相同的问题,并找到了一个更简单的解决方法,即在调用 xarray.open_dataset()
时设置 decode_coords=False
,例如:
xr.open_dataset('wrfout_d01_2019-04-16_15_00_00', decode_coords=False).to_netcdf('test.nc')
进一步讨论here。
我正在尝试使用 xarray 追加和写入 netCDF 文件。下面是原始文件的一些信息。
Dimensions: (Time: 744, south_north: 289, west_east: 339)
Coordinates:
XLAT (Time, south_north, west_east) float32 ...
XLONG (Time, south_north, west_east) float32 ...
Dimensions without coordinates: Time, south_north, west_east
Data variables:
Times (Time) |S19 ...
RAINNC (Time, south_north, west_east) float32 ...
I_RAINNC (Time, south_north, west_east) int32 ...
SNOWNC (Time, south_north, west_east) float32 ...
GRAUPELNC (Time, south_north, west_east) float32 ...
HAILNC (Time, south_north, west_east) float32 ...
这是附加文件的一些信息(添加了两个变量)。
Dimensions: (Time: 744, south_north: 289, west_east: 339)
Coordinates:
XLAT (Time, south_north, west_east) float32 ...
XLONG (Time, south_north, west_east) float32 ...
Dimensions without coordinates: Time, south_north, west_east
Data variables:
Times (Time) |S19 ...
RAINNC (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
I_RAINNC (Time, south_north, west_east) int32 0 0 0 0 0 0 0 0 0 0 0 0
SNOWNC (Time, south_north, west_east) float32 ...
GRAUPELNC (Time, south_north, west_east) float32 ...
HAILNC (Time, south_north, west_east) float32 ...
PRCP (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
CUMPRCP (Time, south_north, west_east) float32 0.0 0.0 0.0 0.0 0.0
我正在尝试使用 xarray.to_netcdf() 写入新文件,但收到此错误:
ValueError: cannot serialize coordinates because variable RAINNC
already has an attribute 'coordinates'
关于如何解决此错误的任何想法?
编辑:
数据是通过天气和研究预报模型 (WRF) 生成的。默认情况下,通过 open_dataset() 使用 decode_cf 加载数据。两个文件的 RAINNC 属性相同,如下所列。
OrderedDict([('FieldType', 104),
('MemoryOrder', 'XY '),
('description', 'ACCUMULATED TOTAL GRID SCALE PRECIPITATION'),
('units', 'mm'),
('stagger', ''),
('coordinates', 'XLONG XLAT XTIME')])
您是如何加载第一个 xarray.Dataset
的? RAINNC
变量、(1) 在 netCDF 文件中、(2) 在加载 xarray 的原始数据集中和 (3) 在组合数据集中有哪些属性?
此错误消息告诉您 RAINNC
在您的组合数据集中有一个 'coordinates'
属性。 Xarray 引发错误,因为它使用 'coordinates'
属性(根据 CF 约定)将坐标(在您的情况下为 XLAT
和 XLONG
)保存到 netCDF 文件。但是,如果存在预先存在的 'coordinates'
属性,它不会这样做,以避免覆盖现有数据。
通常不会出现这种情况,因为当变量添加到 xarray 数据模型中的 coords
时,磁盘上 netCDF 文件中预先存在的 'coordinates'
属性会被删除。但是,如果您将 xarray.open_dataset()
与 decode_cf=False
一起使用,或者如果使用某种手动逻辑来创建数据集,则可能会出现这种情况。
一个简单的解决方法是从组合数据集中的数据变量中删除任何 'coordinates'
属性(例如,del ds['RAINNC'].attrs['coordinates']
),但您绝对应该首先查看这些值,以便确保您没有删除重要的元数据。
我 运行 遇到了与 WRF 文件相同的问题,并找到了一个更简单的解决方法,即在调用 xarray.open_dataset()
时设置 decode_coords=False
,例如:
xr.open_dataset('wrfout_d01_2019-04-16_15_00_00', decode_coords=False).to_netcdf('test.nc')
进一步讨论here。