Home Articles

将'constant'维添加到xarray数据集

Asked
Viewed 1636 times
2

我有一系列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)

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

我试过两种破解方法:

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]

然后我按照上面的相同步骤,更新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')

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

2)第二种方法,然后返回到 xr.Dataset.from_dataframe() 的数据集 . 我试过这个 - 但是在我杀死这个过程之前需要20分钟 .

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

1 Answer

  • 7

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

    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')
    

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

    • 我'm passing in a first for the '时间' coordinate instead of a scalar. You need to pass in a list or 1d array to get a 1D coordinate variable, which is what you need if you also use '时间错误 ValueError: Coordinate objects must be 1-dimensional 试图告诉你什么错误(顺便说一下 - 如果你有关于如何使错误信息更有帮助的想法,我全都耳朵!) .

    • 我正在为DataArray构造函数提供 dims 参数 . 传入(非有序)字典有点危险,因为迭代顺序无法保证 .

    • 我也改为 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尺寸不是很有用 .

Related