就地更新 xarray 中的属性
Updating attritubtes in xarray inplace
我对使用 xarrays 还很陌生。我想就地修改 NetCDF 文件的属性。但是,内置函数却给出了另一个新数据集。
ds = xr.open_dataset(file_)
# ds has "time" as one of the coordinates whose attributes I want to modify
#here is ds for more clarity
ds
>><xarray.Dataset>
Dimensions: (lat: 361, lev: 1, lon: 720, time: 1)
Coordinates:
* lon (lon) float32 0.0 0.5 1.0 1.5 2.0 ... 357.5 358.0 358.5 359.0 359.5
* lat (lat) float32 -90.0 -89.5 -89.0 -88.5 -88.0 ... 88.5 89.0 89.5 90.0
* lev (lev) float32 1.0
* time (time) timedelta64[ns] 00:00:00
Data variables:
V (time, lev, lat, lon) float32 ...
Attributes:
Conventions: CF
constants_file_name: P20000101_12
institution: IACETH
lonmin: 0.0
lonmax: 359.5
latmin: -90.0
latmax: 90.0
levmin: 250.0
levmax: 250.0
我试图分配新的属性,但它给了一个新的数据数组
newtimeattr = "some time"
ds.time.assign_attrs(units=newtimeattr)
或者,如果我将此属性分配给数据集变量 "V",它会向数据集
添加另一个变量
ds['V '] = ds.V.assign_attrs(units='m/s')
## here it added another variable V .So, ds has 2 variables with same name as V
ds #trimmed output
>>Data variables:
V (time, lev, lat, lon) float32 ...
V (time, lev, lat, lon) float32 ...
ds.V.attrs['units'] = 'm/s'
对我有用。同样对于 "time" 这是一个维度
ds.time.attrs['units'] = newtimeattr
来自 xarray 文档,xarray.DataArray.assign_attrs
Returns a new object equivalent to self.attrs.update(*args, **kwargs).
这意味着此方法 returns 一个具有更新属性的新 DataArray(或坐标),您必须将这些分配给数据集才能更新它:
ds.time.assign_attrs(units=newtimeattr)
正如您 一样,这可以通过使用关键字语法访问属性来就地完成:
ds.time.attrs['units'] = newtimeattr
只是澄清一点 - 你最后一条语句添加新变量的原因是因为你将 ds.V
和更新的属性分配给变量 ds['V ']
with a space。由于 python 中的 'V ' != 'V'
,这创建了一个新变量并在更新属性后为其分配了原始 ds.V
的值。否则,您的方法会工作正常:
ds['V'] = ds.V.assign_attrs(units='m/s')
我对使用 xarrays 还很陌生。我想就地修改 NetCDF 文件的属性。但是,内置函数却给出了另一个新数据集。
ds = xr.open_dataset(file_)
# ds has "time" as one of the coordinates whose attributes I want to modify
#here is ds for more clarity
ds
>><xarray.Dataset>
Dimensions: (lat: 361, lev: 1, lon: 720, time: 1)
Coordinates:
* lon (lon) float32 0.0 0.5 1.0 1.5 2.0 ... 357.5 358.0 358.5 359.0 359.5
* lat (lat) float32 -90.0 -89.5 -89.0 -88.5 -88.0 ... 88.5 89.0 89.5 90.0
* lev (lev) float32 1.0
* time (time) timedelta64[ns] 00:00:00
Data variables:
V (time, lev, lat, lon) float32 ...
Attributes:
Conventions: CF
constants_file_name: P20000101_12
institution: IACETH
lonmin: 0.0
lonmax: 359.5
latmin: -90.0
latmax: 90.0
levmin: 250.0
levmax: 250.0
我试图分配新的属性,但它给了一个新的数据数组
newtimeattr = "some time"
ds.time.assign_attrs(units=newtimeattr)
或者,如果我将此属性分配给数据集变量 "V",它会向数据集
添加另一个变量ds['V '] = ds.V.assign_attrs(units='m/s')
## here it added another variable V .So, ds has 2 variables with same name as V
ds #trimmed output
>>Data variables:
V (time, lev, lat, lon) float32 ...
V (time, lev, lat, lon) float32 ...
ds.V.attrs['units'] = 'm/s'
对我有用。同样对于 "time" 这是一个维度
ds.time.attrs['units'] = newtimeattr
来自 xarray 文档,xarray.DataArray.assign_attrs
Returns a new object equivalent to self.attrs.update(*args, **kwargs).
这意味着此方法 returns 一个具有更新属性的新 DataArray(或坐标),您必须将这些分配给数据集才能更新它:
ds.time.assign_attrs(units=newtimeattr)
正如您
ds.time.attrs['units'] = newtimeattr
只是澄清一点 - 你最后一条语句添加新变量的原因是因为你将 ds.V
和更新的属性分配给变量 ds['V ']
with a space。由于 python 中的 'V ' != 'V'
,这创建了一个新变量并在更新属性后为其分配了原始 ds.V
的值。否则,您的方法会工作正常:
ds['V'] = ds.V.assign_attrs(units='m/s')