Zarr是否原生支持NetCDF式整数缩放偏移?ERA5转Zarr存储优化
问题:ERA5 NetCDF转Zarr时保留整数缩放偏移的透明实现方式
我通过Python的xarray和rioxarray读取ERA5数据集的NetCDF(.nc)文件,数据在内存中为float32(4字节)类型,但磁盘上以short(2字节)存储:
$ ncdump -h file.nc ... short u100(time, latitude, longitude) ; u100:scale_factor = 0.000895262699529722 ; u100:add_offset = 2.29252111865024 ; u100:_FillValue = -32767s ; u100:missing_value = -32767s ; ...
xarray会自动应用scale_factor和add_offset将整数转换为浮点数。目前我正在将这些数据重新分块并存储为Zarr,以高效访问单个地理点位的完整时间序列,但Zarr文件体积几乎是原NetCDF的两倍,因为数据仍以浮点数存储。原始数据规模约1TB,带宽与存储成本至关重要,且额外的存储并未带来精度提升(原始数据仅具备16位精度)。
我知道可以手动将数据转回short存入Zarr,读取时再转回浮点数,但这种方式繁琐且易出错,请问是否存在类似NetCDF的透明实现方式?另外,Zarr数组是否原生支持像NetCDF那样的整数缩放与偏移?
解决方案
Zarr的原生支持情况
Zarr原生支持NetCDF式的整数缩放与偏移机制:你可以将scale_factor、add_offset、_FillValue这些属性存入Zarr数组的元数据中,xarray读取Zarr时会自动识别这些属性,透明完成整数到浮点数的转换,逻辑和处理NetCDF完全一致。
透明实现的具体步骤
1. 恢复原始short数据类型并保留属性
从NetCDF读取的float32数据,可通过反向计算转回short类型,同时保留原始属性:
import xarray as xr # 读取原NetCDF数据集 ds = xr.open_dataset("file.nc") # 批量处理所有带缩放偏移的变量 for var_name in ds.data_vars: var = ds[var_name] # 仅处理包含缩放偏移属性的变量 if all(key in var.attrs for key in ["scale_factor", "add_offset", "_FillValue"]): # 将NaN替换为原始填充值 var_filled = var.where(var.notnull(), var.attrs["_FillValue"]) # 反向计算得到原始整数,四舍五入后转为int16 var_short = ((var_filled - var.attrs["add_offset"]) / var.attrs["scale_factor"]).round().astype("int16") # 保留原始属性 var_short.attrs = var.attrs # 替换数据集中的变量 ds[var_name] = var_short
2. 按需求分块写入Zarr
针对单点位时间序列高效访问的需求,设置分块规则(比如时间维度整存,经纬度维度单点位分块),然后写入Zarr:
# 定义分块规则:时间维度完整存储,经纬度各1个点位为一块 chunk_config = {"time": None, "latitude": 1, "longitude": 1} # 生成编码配置,为每个变量指定分块 encoding = {var: {"chunks": chunk_config} for var in ds.data_vars} # 写入Zarr ds.to_zarr("era5_optimized.zarr", mode="w", encoding=encoding)
3. 透明读取Zarr数据
读取Zarr时,xarray会自动应用缩放偏移,直接得到float32类型的数据,无需手动处理:
ds_zarr = xr.open_zarr("era5_optimized.zarr") print(ds_zarr["u100"].dtype) # 输出: float32 # 数据精度和原NetCDF读取结果完全一致
关键注意事项
- 反向计算时必须使用
round():确保转换后的整数和原始NetCDF存储的short值一致,避免精度偏差。 - 填充值处理:必须先将NaN替换为原始
_FillValue,否则转换后的short值会出现错误。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

