csv 一种有效的方法来添加“时间”维度到二维(x,y)NetCDF文件,其中变量在不同时间表示相同的变量

hivapdat  于 2023-09-28  发布在  Etcd
关注(0)|答案(1)|浏览(160)

我有一个包含x和y坐标的CSV文件,以及三个不同时间步长的变量值,如下所示:

x, y, var_t1, var_t2, var_t3,
1, 1, 8,      8,      6
1, 2, 6,      1,      2
2, 1, 5,      3,      7
2, 2, 7,      2,      6

我已经学会了使用以下方法创建NetCDF文件:

import xarray as xr
xr.Dataset.from_dataframe(df.set_index(['x', 'y'])).to_netcdf('filename.nc')

这将产生一个以x和y为维度的NetCDF,我得到了3个不同的变量。
我的目标是创建一个NetCDF,其中x、y和t作为具有单个变量的维度。
我设法做到了这一点,但我觉得我是以一种非常复杂的方式做到的。
我的解决方案是使用CSV文件并将其延长3倍,同时添加一个“t”列来表示时间步长:

x, y, t, var_t1, var_t2, var_t3,
1, 1, 0, 8,      0,      0
1, 2, 0, 6,      0,      0
2, 1, 0, 5,      0,      0
2, 2, 0, 7,      0,      0
1, 1, 1, 0,      8,      0
1, 2, 1, 0,      1,      0
2, 1, 1, 0,      3,      0
2, 2, 1, 0,      2,      0
1, 1, 2, 0,      0,      6
1, 2, 2, 0,      0,      2
2, 1, 2, 0,      0,      7
2, 2, 2, 0,      0,      6

现在我申请的时候

import xarray as xr
xr.Dataset.from_dataframe(df.set_index(['x', 'y', 't'])).to_netcdf('filename.nc')

我得到了一个具有x,y,t维度的NetCDF,每个不同的时间都有一个变量(即当t = 1时,只有var_t2!= 0)。
如果我将来遇到类似的问题,有没有一种更简单的方法来实现这一点?这很容易做到,只有3个时间步,但我会遇到麻烦,与数万或数千个时间步。
谢谢你,谢谢!

qzlgjiam

qzlgjiam1#

假设你有一个框架df

>> df
x  y  var_t1  var_t2  var_t3
0  1  1       8       8       6
1  1  2       6       1       2
2  2  1       5       3       7
3  2  2       7       2       6

你可以设置x,y作为索引,将其转换为xarray,合并变量var_t1...并将new_times设置为时间维度的坐标:

>> ds = df.set_index(["x", "y"]).to_xarray()
>> ds
<xarray.Dataset>
Dimensions:  (x: 2, y: 2)
Coordinates:
  * x        (x) int64 1 2
  * y        (y) int64 1 2
Data variables:
    var_t1   (x, y) int64 8 6 5 7
    var_t2   (x, y) int64 8 1 3 2
    var_t3   (x, y) int64 6 2 7 6

>> new_times = range(3)
>> ds_result = ds.to_array(dim="time").assign_coords(time=new_times)
>> ds_result
<xarray.DataArray (time: 3, x: 2, y: 2)>
array([[[8, 6],
        [5, 7]],

       [[8, 1],
        [3, 2]],

       [[6, 2],
        [7, 6]]])
Coordinates:
  * x        (x) int64 1 2
  * y        (y) int64 1 2
  * time     (time) int64 0 1 2

相关问题