使用xarray.to_zarr()追加数据时历史数据纬度翻转问题排查
气象Zarr文件追加数据后历史数据纬度翻转问题
问题背景
我有一个聚焦法国区域的每日气象数据Zarr文件,初始状态正常,其ds.chunksizes为:
Frozen({'time': (49, 49, 49, 49, 49, 49, 49, 49, 49, 44), 'latitude': (105,), 'longitude': (161,)})
我通过以下代码追加32天数据:
# 无论如何,输出的time块大小会是8,对应文件的8天数据 ds = ds.chunk(chunks={"time": 49, "latitude": 105, "longitude": 161}) with Client(LocalCluster(processes=False, n_workers=1, threads_per_worker=1)): ds.to_zarr(mapper, mode="a", consolidated=True, append_dim="time", safe_chunks=True)
追加后块大小变为:
Frozen({'time': (49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 27), 'latitude': (105,), 'longitude': (161,)})
但追加前的历史数据出现纬度方向翻转,新追加的数据则正常(已验证对应的NetCDF文件无问题)。
环境版本
使用的依赖版本:
- zarr==2.17.2
- fsspec>=2024.2.0
- s3fs>=2024.2.0
- xarray2024.3.0
且在zarr2.16.1和xarray==2023.08.0版本下结果一致。
初始Zarr创建代码
该Zarr文件最初通过以下代码创建:
compressor = zarr.Blosc(cname="zstd", clevel=3) encoding = {vname: {"compressor": compressor} for vname in data.data_vars} data.to_zarr(mapper, mode="w", encoding=encoding, consolidated=True)
同一脚本中,初始写入10天数据后切换为追加模式时曾正常工作。
已尝试的解决方案
我尝试过在追加前对原文件重新分块(保持相同块大小):
ds = xr.open_zarr(mapper) ds = ds.sortby(['time','latitude','longitude']) ds = ds.assign_coords(longitude=([lon - 360 if lon > 180 else lon for lon in ds.longitude])) ds = ds.sortby('longitude') ds = ds.squeeze(drop=True) ds = ds.unify_chunks()
也尝试过用rechunker包对初始文件和结果文件重新分块,但始终存在纬度翻转问题。
特殊测试情况
- 若用新下载的数据创建块大小为
Frozen({'time': (44,), 'latitude': (105,), 'longitude': (161,)})的新Zarr文件,再用相同代码追加则无问题。 - 但如果从原数据提取最后2个块(块大小为
Frozen({'time': (49, 44), 'latitude': (105,), 'longitude': (161,)}))创建新Zarr,追加时仍会出现纬度翻转;仅提取最后1个块(块大小为Frozen({'time': (44), 'latitude': (105,), 'longitude': (161,)}))创建的Zarr也存在同样问题。
我已重新下载所有数据,但问题依旧。请问如何在下载/Zarr化过程中检测并修正该问题?此问题可能与xarray写入NetCDF时的纬度翻转问题相关。
内容的提问来源于stack exchange,提问作者PierreL
相关产品推荐
相关产品推荐

