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