在子集化DataArray时保留xarray.Dataset中的坐标
我想为一个特定的维度设置多个坐标系统,比如说一个单独的 "time"
维度,里面有默认的 datetime64[ns]
类型的坐标,还有数字年份或者季节的坐标。听起来可以通过 Dataset.assign_coords()
来实现,但在从 Dataset
中提取 DataArray
时,出现了一些意想不到的问题。
我正在使用这个公开的NASA数据集(需要Earthdata登录);更详细的描述可以在这个链接找到。
import xarray as xr
import numpy as np
ds = xr.open_mfdataset('GRCTellus.JPL.200204_202311.GLO.RL06.1M.MSCNv03CRI.nc')
ds.coords['lon'] = ds.coords['lon'] - 180
# Get a list of all the dates from the "time" coordinate
dates = ds.coords['time'].values
# Convert each "datetime64[ns]" object to a 4-digit year
years = []
for each in dates:
years.append(int(str(each)[0:4]))
# Create a new set of coordinates
ds = ds.assign_coords(year = ('year', years))
<xarray.Dataset>
Dimensions: (lat: 360, time: 227, lon: 720, bounds: 2, year: 227)
Coordinates:
* lat (lat) float64 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75
* time (time) datetime64[ns] 2002-04-17T12:00:00 ... 2023-11-16
* lon (lon) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8
* year (year) int64 2002 2002 2002 2002 2002 ... 2023 2023 2023 2023
到目前为止,这个方法效果很好,我现在有了一个 year
坐标。不过,我还多出了一个 year
维度,这并不是我想要的。
更严重的问题是,当我从这个 Dataset
中选择一个 DataArray
时,它对新坐标一无所知。
ds['lwe_thickness'].sel(lon = slice(-124, -114), lat = slice(32, 42))
<xarray.DataArray 'lwe_thickness' (time: 227, lat: 20, lon: 20)>
dask.array<getitem, shape=(227, 20, 20), dtype=float64, chunksize=(46, 20, 20), chunktype=numpy.ndarray>
Coordinates:
* lat (lat) float64 32.25 32.75 33.25 33.75 ... 40.25 40.75 41.25 41.75
* time (time) datetime64[ns] 2002-04-17T12:00:00 ... 2023-11-16
* lon (lon) float64 -123.8 -123.2 -122.8 -122.2 ... -115.2 -114.8 -114.2
结果是 "time"
被列为一个坐标,但 "year"
却没有。这对使用DataArray.polyfit()
有影响,因为没有 "year"
坐标,我就无法得到以年份为单位的系数值。
我该如何让每个 DataArray
在我的 Dataset
中都能使用新的坐标系统呢? 我查阅了:
- “向xarray.DataArray添加新坐标” - 但当我尝试这个时,出现了
ValueError: cannot add coordinates with new dimensions to a DataArray
的错误。
1 个回答
1
你是在告诉它把新的坐标连接到新创建的维度'年'上。我没有在你的具体数据上试过,但你可以试着把坐标'年'连接到已有的维度'时间'上。
ds = ds.assign_coords(year = ('time', years))
这样的话,'年'这个坐标也应该会出现在定义在'时间'这个维度上的数据数组里。