用dask迭代填充xarray中的NaN值

时间:2019-08-01 15:02:28

标签: python dask python-xarray

我有一个很大的三维数据集(y,x,时间),并且有很大的间隙(NaN)。我想用上次的值迭代地填充缺失的值。

这是一个玩具示例:

import xarray as xr
import numpy as np

# 1. Generate a sample DataArray with missing values
dims = ('y', 'x', 't')
shape = (1000, 1000, 10)
coords = {d: np.arange(s) for d, s in zip(dims, shape)}
mask = np.random.randint(0, 2, shape)
data = np.where(mask, np.random.rand(*shape), np.nan)
da = xr.DataArray(data, dims=dims, coords=coords)

# 2. Write and reload from disk as dask array
da.to_netcdf('_tmp.nc')
da = xr.open_dataarray('_tmp.nc', chunks={'y': 100, 'x': 100, 't': 1})

# 3. Iteratively fill gaps
for t in range(1, len(da['t'])):
    # The following doesn't work with dask arrays
    da[{'t': t}] = da[{'t': t}].fillna(da[{'t': t-1}])

这可以正常工作,但是dask数组不支持项目分配,因此最后一行不起作用。我的数据集太大,无法读入内存,因此无法调用.load()

在仍然利用通过dask提供的块的惰性评估的同时,有没有办法以这种方式使用.fillna()

我的真实数据约为10000x10000x100,并包含多个变量。

1 个答案:

答案 0 :(得分:3)

目前,Xarray仅部分支持这种操作。理想情况下,您可以使用da.ffill(),但是实现中存在一些可能无法为您带来预期结果的问题(明确地说,xarray当前不支持在块之间填充)。

您可能想看看GitHub问题,以尝试一种可能的解决方法:https://github.com/pydata/xarray/issues/2699

如果您想要什么,我鼓励您参与这个问题。