为xarray数据集添加"常量"维度

bad*_*ley 4 python python-xarray

我有一系列CSV格式的月度网格化数据集.我想阅读它们,添加几个维度,然后写入netcdf.我以前在使用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)
Run Code Online (Sandbox Code Playgroud)

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

我试过两种破解方法:

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]
Run Code Online (Sandbox Code Playgroud)

然后我按照上面的相同步骤,更新coords以包含第三个维度.

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')
Run Code Online (Sandbox Code Playgroud)

这对于创建DataArray很好 - 但是当我尝试转换为数据集(因此我可以写入netCDF)时,我收到有关'ValueError:Coordinate objects必须是1维'的错误

2)我尝试的第二种方法是将我的数据阵列,将其转换为数据帧,将索引设置为['lat','lng','time'],然后返回到数据集xr.Dataset.from_dataframe().我试过这个 - 但是在我杀死这个过程之前需要20多分钟.

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

sho*_*yer 10

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

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')
Run Code Online (Sandbox Code Playgroud)

你会发现我的版本有一些变化:

  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')
Run Code Online (Sandbox Code Playgroud)

这个版本很好地概括了很多天的数据连接 - 你只需要更长时间的DataArrays列表.根据我的经验,大多数时候,你首先想要额外维度的原因是能够沿着它连接.长度1尺寸不是很有用.