You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
    且在zarr
    2.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:13:12