xarray中合并nc文件导致数据的数值改变/出现nan

Python
Article Directory

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

今天下了ERA5的再分析数据准备做REOF,结果却发现报错说我的数据有缺测值。搜索了一番发现原来是ERA5的scaleoffset导致的。

水博客+1

先来看问题,我写了脚本批量下载了很多时次的数据,然后使用open_mfdataset来合并出一个单个数据文件用来进行下一步的操作,却发现在合并出的数据中出现了本不存在的nan。经过搜索后发现是由于nc文件存在scaleoffset导致的 (相关issue)。

为了节省空间有些nc文件会将原始的浮点型数据经过变换变成short型数据,并在数据文件中记录scale_factoradd_offset来在读取数据时进行还原,具体的还原公式如下

公式

而在合并数据的过程中,会先读取数据进行还原,然后再把数据重新变换会short型。这个过程中有可能会出现类型转换的错误,最终导致数据改变或者出现nan

简单解决的办法就是在使用open_mfdataset的时候传入mask_and_scale=False参数关闭还原数据的过程,但是这样又会导致一个问题,每个文件的scale_factoradd_offset是不一样的,最后保存单个文件的时候只保存了一个scale_factoradd_offset,还原出来的数据肯定不对啊。

合并后的数据 合并前的数据

合并后的数据(上)和合并前的数据(下)

最好的解决办法就是使用open_mfdataset合并时,在保存到新的nc文件之前手动删掉每个变量中保存的encoding信息,这样保存时xarray不会重新对数据编码,而是以float32的类型保存变量,就可以防止数据发生变化了。不过这个方法也有一个缺点,就是保存出来的数据会更大。

1
2
3
4
5
6
7
8
# concat file
dataset = open_mfdataset(data_path)
# remove encoding in variables to avoid value change
for variables in dataset.keys():
dataset[variables].encoding.pop("scale_factor")
dataset[variables].encoding.pop("add_offset")
dataset[variables].encoding.pop("dtype")
dataset.to_netcdf(integrated_file_path)

Author: Syize

Permalink: https://blog.syize.cn/2023/07/09/xarray-open-mfdataset-value-change/

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog

Comments