我有一系列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分钟以上才能杀死进程。
xr.Dataset.from_dataframe()
有谁知道我如何获得每月“时间”维度的数据集?
您的第一个示例非常接近:
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')
您会注意到我的版本中有一些更改:
ValueError: Coordinate objects must be 1-dimensional
dims
datetime.datetime
pd.datetime
另一种明智的方法是concat将“时间”添加为标量坐标后,再使用一项的列表,例如,
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尺寸不是很有用。