在子集化DataArray时保留xarray.Dataset中的坐标

0 投票
1 回答
15 浏览
提问于 2025-04-13 14:59

我想为一个特定的维度设置多个坐标系统,比如说一个单独的 "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 中都能使用新的坐标系统呢? 我查阅了:

1 个回答

1

你是在告诉它把新的坐标连接到新创建的维度'年'上。我没有在你的具体数据上试过,但你可以试着把坐标'年'连接到已有的维度'时间'上。

 ds = ds.assign_coords(year = ('time', years))

这样的话,'年'这个坐标也应该会出现在定义在'时间'这个维度上的数据数组里。

撰写回答