python - 向 xarray 数据集添加 'constant' 维度

标签 python python-xarray

我有一系列 CSV 格式的月度网格化数据集。我想读取它们,添加几个维度,然后写入 netcdf。我过去在使用 xarray (xray) 方面有丰富的经验,所以我认为我会使用 if 来完成这项任务。

我可以轻松地将它们放入 2D DataArray,例如:

data = np.ones((360,720))
lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords =  {'lat': lats, 'lng':lngs}
da = xr.DataArray(data, coords=coords)

但是当我尝试添加另一个维度来传达有关时间的信息时(所有数据都来自同一年/月),事情开始变糟。

我试过两种方法来破解这个:

1) 将我的输入数据扩展到 m x n x 1,类似于:

data = np.ones((360,720))
lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords =  {'lat': lats, 'lng':lngs}
data = data[:,:,np.newaxis]

然后我按照与上述相同的步骤进行操作,更新坐标以包含第三个维度。

lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords =  {'lat': lats, 'lng':lngs}
coords['time'] = pd.datetime(year, month, day))
da = xr.DataArray(data, coords=coords)
da.to_dataset(name='variable_name')

这对于创建 DataArray 很好——但是当我尝试转换为数据集时(以便我可以写入 netCDF),我收到有关“ValueError:坐标对象必须是一维”的错误

2) 我尝试过的第二种方法是采用我的数据数组,将其转换为数据框,将索引设置为 ['lat','lng', 'time'] 然后返回到数据集 xr.Dataset.from_dataframe()。我试过这个——但是在我终止进程之前需要 20 多分钟。

有谁知道如何获得具有每月“时间”维度的数据集?

最佳答案

你的第一个例子非常接近:

lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords =  {'lat': lats, 'lng': lngs}
coords['time'] = [datetime.datetime(year, month, day)]
da = xr.DataArray(data, coords=coords, dims=['lat', 'lng', 'time'])
da.to_dataset(name='variable_name')

您会注意到我的版本有一些变化:

  1. 我将首先传递“时间”坐标而不是标量。您需要传入列表或一维数组以获取一维坐标变量,如果您还使用“时间”作为维度,这就是您所需要的。这就是错误 ValueError: Coordinate objects must be 1-dimensional 试图告诉你的(顺便说一句——如果你有关于如何使该错误消息更有用的想法,我洗耳恭听!).
  2. 我正在为 DataArray 构造函数提供一个 dims 参数。传入(无序)字典有点危险,因为无法保证迭代顺序。
  3. 我还切换到 datetime.datetime 而不是 pd.datetime。后者只是前者的别名。

另一种明智的方法是在将“时间”添加为标量坐标后,将 concat 与一个项目的列表一起使用,例如,

lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords =  {'lat': lats, 'lng': lngs, 'time': datetime.datetime(year, month, day)}
da = xr.DataArray(data, coords=coords, dims=['lat', 'lng'])
expanded_da = xr.concat([da], 'time')

这个版本很好地概括了将几天来的数据连接在一起——你只需让 DataArrays 列表更长。根据我的经验,大多数时候你首先想要额外维度的原因是能够沿着它连接。否则长度 1 维度不是很有用。

关于python - 向 xarray 数据集添加 'constant' 维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173580/

相关文章:

python - 如何将字典中包含的多维数组存储在 python xarray 中?

python - 使用 Xarray 和 Numpy 数组进行多处理

python - 如何在 AWS Sagemaker 中检索分段掩码中使用的标签

python - 'int' 类型的参数不可迭代

python - 使用一条语句导入多个模块

Python(汤): get nested data and get last item in a tag

Python Post 形成防刮保护

python - 具有无量纲坐标的 Xarray plot.line

python - 带有 dask sel 的 xarray 很慢

python - 屏蔽格陵兰岛以外的岛屿和轮廓颜色(Python)