我正在尝试将多个 NetCDF4 文件转换为 GeoTIFF 栅格,同时将数据从每日频率降低到每月频率(忽略 NaN)。不幸的是,当我想将数据写入 geotiff 时,我遇到了错误。
使用 xarray 打开和下采样文件很容易(如果与 R 相比,功能很棒,这是我习惯使用的)只保留一个变量,如我所愿并从每日值计算每月平均值,但是,我被困在试图将我的结果导出/转换为多个 *.tif 文件。
甚至尝试将其转换为多个 NetCDF3 文件,因为我可以轻松地将它们转换为 geotiff,但也失败了。
输入数据是每日频率的 4018 个 ESA 土壤水分“.nc4”文件,覆盖全球,但每一步都不完整(每天只有条带充满数据,其余为空/NA),所以我想忽略 NaN用于计算每月平均值。
总的来说,这 4018 天总计长达 132 个月(11 年),而我的 xarray 数据集由下面的代码生成,似乎正如预期的那样表明了这一点。
import xarray as xr
# opening the files into an array
mfdataDIR = 'C:/full_path_here/*.nc'
DS = xr.open_mfdataset(mfdataDIR)
# downsampling it from daily to monthly means while keeping attributes and ignoring NAs
monthly_data = DS.sm.resample(time="1M").mean(skipna= True, keep_attrs=True)
我在这里收到以下警告:“默认缩减维度将在 xarray 0.12 之后更改为分组维度。要消除此警告,请显式传递 dim=xarray.ALL_DIMS。skipna=skipna, allow_lazy=True, **kwargs)” 不确定如果这很重要,但当我打印monthly_data xarray 时结果似乎还可以。
# Now, trying to convert to GeoTIFFs using Robin Wilson's rasterio_to_xarray (and vice-versa) script (full script can be found on link below).
import sys
sys.path.insert(0, 'C:/path_to_py_script/')
import xarray_to_rasterio as xarrast
xarrast.xarray_to_rasterio_by_band(monthly_data, 'C:/path_here/%s.tif', dim= 'time')
现在我收到了这个错误:“IndexError: tuple index out of range” 我认为错误在于我尝试使用它的方式,而不是在脚本上,尽管我看不到在哪里。
Robin Wilson 制作的脚本非常适合我的目标,从这里获得:https ://github.com/robintw/XArrayAndRasterio/blob/master/rasterio_to_xarray.py
我看到错误追溯到第 84 行:
82 if len(xa.shape) == 2:
83 count = 1
84 height = xa.shape[0]
85 width = xa.shape[1]
86 band_indicies = 1
87 else:
和第 122 行:
122 xarray_to_rasterio(data, filename)
所以,看来我的时间很暗,我希望能算作乐队,这不是剧本所期望的,所以它失败了。而且我显然搞砸了“文件名”参数。
不知道怎么...我可以使用这个脚本或修改它来做我想做的事吗?(保存132个“.tif”文件对应132级时间dim)
# Second option, not ideal but could still help me, if it hadn't also failed:
mDS = monthly_data.to_dataset()
paths = ['C:/path_here/%s.nc' ]
xr.save_mfdataset(mDS, paths, format='NETCDF3_CLASSIC')
got this error: "TypeError: save_mfdataset only supports writing Dataset objects, received type <class 'str'>"
我认为我缺乏 python 知识阻碍了我,因为我在两个过程中都遇到错误(xarray 到 GeoTIFF 或 xarrayDataset 到 NetCDF3 经典)。
当我检查monthly_data 时,我看到了我的预期:只有“sm”变量、所有三个维度和132 个时间“值”。
有人可以帮忙吗?