对不包含时间维度的文件使用 xarray open_mfdataset

hm8*_*hm8 4 netcdf python-xarray

我有一个 NetCDF 文件列表,我想用该xarray.open_mfdataset函数打开它们。

这通常是微不足道的,但是我遇到了一个问题,因为我尝试打开的文件中不包含任何“时间”维度:

data
Out[51]: 
<xarray.Dataset>
Dimensions:  (lat: 850, lon: 1500)
Coordinates:
  * lat      (lat) float64 54.98 54.94 54.9 54.86 ... 21.14 21.1 21.06 21.02
  * lon      (lon) float64 -126.0 -125.9 -125.9 -125.9 ... -66.1 -66.06 -66.02
Data variables:
    Data     (lat, lon) float32 ...
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 open_mfdataset 打开文件列表时,我当然会收到错误:

xr.open_mfdataset(files)

ValueError: Could not find any dimension coordinates to use to order the datasets for concatenation
Run Code Online (Sandbox Code Playgroud)

不过,我确实有一个与每个文件对应的日期列表:

dates
Out[54]: 
array([datetime.datetime(2009, 1, 1, 0, 0),
       datetime.datetime(2009, 1, 2, 0, 0),
       datetime.datetime(2009, 1, 3, 0, 0), ...,
       datetime.datetime(2019, 12, 29, 0, 0),
       datetime.datetime(2019, 12, 30, 0, 0),
       datetime.datetime(2019, 12, 31, 0, 0)], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我假设有某种方法可以为每个文件添加时间维度,并使用open_mfdataset,可能使用“预处理”参数打开它们。

谢谢你的帮助。

hm8*_*hm8 9

这是我的解决方案:

创建一个向 DataArray 添加时间维度的函数,并用任意日期填充它:

def add_time_dim(xda):
    xda = xda.expand_dims(time = [datetime.now()])
    return xda
Run Code Online (Sandbox Code Playgroud)

preprocess然后,在运行函数时将此函数传递给参数open_mfdataset

data = xr.open_mfdataset(files, preprocess = add_time_dim)
Run Code Online (Sandbox Code Playgroud)

time最后,用我的日期填充维度:

data['time'] = dates
Run Code Online (Sandbox Code Playgroud)