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的scale
和offset
导致的。
水博客+1
先来看问题,我写了脚本批量下载了很多时次的数据,然后使用open_mfdataset
来合并出一个单个数据文件用来进行下一步的操作,却发现在合并出的数据中出现了本不存在的nan
。经过搜索后发现是由于nc文件存在scale
和offset
导致的 (相关issue)。
为了节省空间有些nc文件会将原始的浮点型数据经过变换变成short
型数据,并在数据文件中记录scale_factor
和add_offset
来在读取数据时进行还原,具体的还原公式如下
而在合并数据的过程中,会先读取数据进行还原,然后再把数据重新变换会short
型。这个过程中有可能会出现类型转换的错误,最终导致数据改变或者出现nan
。
简单解决的办法就是在使用open_mfdataset
的时候传入mask_and_scale=False
参数关闭还原数据的过程,但是这样又会导致一个问题,每个文件的scale_factor
和add_offset
是不一样的,最后保存单个文件的时候只保存了一个scale_factor
和add_offset
,还原出来的数据肯定不对啊。
合并后的数据(上)和合并前的数据(下)
最好的解决办法就是使用open_mfdataset
合并时,在保存到新的nc文件之前手动删掉每个变量中保存的encoding
信息,这样保存时xarray
不会重新对数据编码,而是以float32
的类型保存变量,就可以防止数据发生变化了。不过这个方法也有一个缺点,就是保存出来的数据会更大。
1 | # concat file |
Author: Syize
Permalink: https://blog.syize.cn/2023/07/09/xarray-open-mfdataset-value-change/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog!
Comments