xArray 的 to_dataset 和全局属性
xArray's to_dataset and global attributes
假设我有一个名为“mse”的 xArray dataArray,其中包含元数据:
<xarray.DataArray 'mse' (time: 248, level: 37, lat: 73, lon: 144)>
array([[[[693757.8 , ...cut...]]]], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 1979-01-01 ... 1979-01-31T21:00:00
* level (level) float64 1.0 2.0 3.0 5.0 7.0 ... 925.0 950.0 975.0 1e+03
* lat (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
Attributes:
long_name: Moist static energy
units: J/kg
我想将此 dataArray 写入 netCDF 文件,但我还想向生成的文件添加一些 global 属性。我可以使用 mse.to_netCDF(path="./testout.nc", unlimited_dims="time")
将这个单一的 dataArray 写入 netCDF 文件,但没有出现全局属性,正如预期的那样。接下来,我尝试将 dataArray 转换为 xArray dataset,然后在该数据集上设置一个新的全局属性(如下),但我的几次尝试都导致错误:
dsMSE = mse.to_dataset
print(dsMSE) # This results in identical output as above, but with "<bound method DataArray.to_dataset of " prepended to the first line
dsMSE.attrs['test'] = 50 # AttributeError: 'function' object has no attribute 'attrs'
dsMSE.assign_attrs(test='test1') # AttributeError: 'function' object has no attribute 'attrs'
dsMSE.attrs = {'test': 'test1'} # AttributeError: 'method' object has no attribute 'attrs'
退一步说,如果我打开一个单独的现有 netCDF 文件,我可以轻松地添加 to/change 它的全局属性:
ds = xr.open_dataset(f)
ds.attrs['new'] = 'new1' # Success, confirmed by printout
为什么 dsMSE=mse.to_dataset
无法生成可以添加新全局属性的可行 xArray 数据集(以及“<绑定方法...”意味着什么)?我肯定错过了什么。有一个优雅的解决方法吗?我宁愿避免必须从头开始创建一个新的数据集(例如,dsMSE = xr.Dataset(...)
),因为我已经有了 dataArray 及其元数据。
xr.DataArray.to_dataset
是一个函数,不是属性,所以你需要调用它,例如:
dsMSE = mse.to_dataset(name='mse')
提示是当您打印 mse.to_dataset
时您得到了标题 <bound method Array.to_dataset of [dataset repr]>
- 这实际上是在告诉您您没有数据集;相反,你有一个 DataArray 的方法。本质上,您打印了一个函数 :)
dsMSE = mse.to_dataset
print(dsMSE) # This results in identical output as above, but with "<bound method DataArray.to_dataset of " prepended to the first line
假设我有一个名为“mse”的 xArray dataArray,其中包含元数据:
<xarray.DataArray 'mse' (time: 248, level: 37, lat: 73, lon: 144)>
array([[[[693757.8 , ...cut...]]]], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 1979-01-01 ... 1979-01-31T21:00:00
* level (level) float64 1.0 2.0 3.0 5.0 7.0 ... 925.0 950.0 975.0 1e+03
* lat (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
Attributes:
long_name: Moist static energy
units: J/kg
我想将此 dataArray 写入 netCDF 文件,但我还想向生成的文件添加一些 global 属性。我可以使用 mse.to_netCDF(path="./testout.nc", unlimited_dims="time")
将这个单一的 dataArray 写入 netCDF 文件,但没有出现全局属性,正如预期的那样。接下来,我尝试将 dataArray 转换为 xArray dataset,然后在该数据集上设置一个新的全局属性(如下),但我的几次尝试都导致错误:
dsMSE = mse.to_dataset
print(dsMSE) # This results in identical output as above, but with "<bound method DataArray.to_dataset of " prepended to the first line
dsMSE.attrs['test'] = 50 # AttributeError: 'function' object has no attribute 'attrs'
dsMSE.assign_attrs(test='test1') # AttributeError: 'function' object has no attribute 'attrs'
dsMSE.attrs = {'test': 'test1'} # AttributeError: 'method' object has no attribute 'attrs'
退一步说,如果我打开一个单独的现有 netCDF 文件,我可以轻松地添加 to/change 它的全局属性:
ds = xr.open_dataset(f)
ds.attrs['new'] = 'new1' # Success, confirmed by printout
为什么 dsMSE=mse.to_dataset
无法生成可以添加新全局属性的可行 xArray 数据集(以及“<绑定方法...”意味着什么)?我肯定错过了什么。有一个优雅的解决方法吗?我宁愿避免必须从头开始创建一个新的数据集(例如,dsMSE = xr.Dataset(...)
),因为我已经有了 dataArray 及其元数据。
xr.DataArray.to_dataset
是一个函数,不是属性,所以你需要调用它,例如:
dsMSE = mse.to_dataset(name='mse')
提示是当您打印 mse.to_dataset
时您得到了标题 <bound method Array.to_dataset of [dataset repr]>
- 这实际上是在告诉您您没有数据集;相反,你有一个 DataArray 的方法。本质上,您打印了一个函数 :)
dsMSE = mse.to_dataset
print(dsMSE) # This results in identical output as above, but with "<bound method DataArray.to_dataset of " prepended to the first line