小编典典

向xarray数据集添加“常量”维

python

我有一系列CSV格式的每月网格化数据集。我想阅读它们,添加一些尺寸,然后写入netcdf。过去,我在使用xarray(xray)方面有丰富的经验,所以我认为如果要使用xarray(xray)可以完成此任务。

我可以轻松地将它们放入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)将输入数据扩展到mxnx 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分钟以上才能杀死进程。

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


阅读 215

收藏
2021-01-16

共1个答案

小编典典

您的第一个示例非常接近:

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. 我为dimsDataArray构造函数提供了一个参数。传递(无序)字典有些危险,因为不能保证迭代顺序。
  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尺寸不是很有用。

2021-01-16