请对此提供任何帮助。我有一个使用.to_xarray()方法从熊猫数据帧创建的xarray,其格式如下:
<xarray.Dataset>
Dimensions: (lat: 556, lon: 1438, time: 96)
Coordinates:
* time (time) datetime64[ns] 2005-01-01 2006-01-01 ... 2100-01-01
* lat (lat) float64 -55.38 -55.12 -54.88 -54.62 ... 82.88 83.12 83.38
* lon (lon) float64 -69.88 -69.62 -69.38 -69.12 ... -26.12 -24.38 -24.12
Data variables:
1.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
2.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
3.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
4.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
5.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
6.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
7.0 (lat, lon, time) float32 nan nan nan nan nan ... nan nan nan nan
当我尝试使用.to_netcdf()保存它时,出现以下错误:
TypeError: DataArray.name or Dataset key must be either a string or None for serialization to netCDF files
我尝试通过ds_land [1.0] .name ='class_1'等更改变量的名称,但这也会产生相同的错误。有什么想法吗?
答案 0 :(得分:0)
在序列化之前,您需要使用rename()
将变量重命名为字符串,而不是在DataArray上设置name
属性。这是因为variables names in netCDF must be strings。
import xarray as xr
ds = xr.Dataset()
ds[1.0] = xr.DataArray([1, 2, 3])
ds[1.0].attrs['name'] = 'class_1'
ds.to_netcdf('testing.nc') # this fails, as you have seen
ds = ds.rename({1.0: 'class_1'})
ds.to_netcdf('testing2.nc') # this works
因此,将变量重命名为'1.0'
也会达到目的:
ds = xr.Dataset()
ds[1.0] = xr.DataArray([1, 2, 3])
ds = ds.rename({1.0: '1.0'})
ds.to_netcdf('testing3.nc') # this also works
顺便说一句,考虑到变量的命名方式,它们似乎可以作为另一个维度更好,因此您有一个由lat
,lon
,{{ 1}},time
。