我有一系列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 回答
你的第一个例子非常接近:
你会发现我的版本有一些变化:
我'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
将一个项目列表作为标量坐标,例如,这个版本很好地概括了很多天的数据连接 - 你只需要更长时间的DataArrays列表 . 根据我的经验,大多数时候,你首先想要额外维度的原因是能够沿着它连接 . 长度1尺寸不是很有用 .