当前位置: 首页 > 知识库问答 >
问题:

在xarray中导入和解码数据集以避免冲突的_FillValue和缺少的_value

杜祺
2023-03-14

使用xarray open_数据集或open_mfdataset加载NARR netcdf数据集时(例如。ftp://ftp.cdc.noaa.gov/Datasets/NARR/monolevel/air.2m.2010.nc),xarray返回关于“冲突的_FillValue和缺少的_值”的错误。

进入:

xarray.open_datasetair.2m.2010.nc

产生以下错误:

发现冲突的_FillValue和missing_value。考虑使用decode_cf=False打开违规数据集,纠正属性,并使用xray.conventions.decode_cf(ds))显式解码

当使用建议以这样的方式打开时:

ds=xarray.open_dataset('air.2m.2010.nc',decode_cf=False)

数据集已打开,但变量、时间、坐标等未解码(显然)。显式使用xarray.decode\u cf(ds)似乎无助于成功解码数据集,因为遇到了相同的错误。

我认为出现这个错误是因为NARR数据集是一个Lambert共形,所以由于网格的形状,当它被xray打开时,会有一些缺失的值,出于某种原因,这与填充值相冲突。

在xarray中打开和解码此文件的最佳方式是什么?

注意:我已经能够使用netcdf4 python打开和解码,但我希望能够在xarray中这样做,以利用dask提供的核心外计算html" target="_blank">功能。

共有2个答案

景景胜
2023-03-14

我能够解决来自同一来源和xarray的NARR数据的类似问题,但只针对时间变量。我没有其他变量的问题。

我确信有更简单的方法来做到这一点(我在python xray还是个新手),但是我最终从我感兴趣的数据集中获取了时间变量和值,创建了一个新的数据集并“解码”了时间,然后在我感兴趣的原始数据集中更新时间变量和值。

test = xr.open_mfdataset(r'evap*nc',decode_cf=False)

t_unit = test.variables['time'] 
t_unit.attrs['units']
#u'hours since 1800-1-1 00:00:0.0'

attrs = {'units': 'hours since 1800-01-01'}
ds = xr.Dataset({'time': ('time', t_unit, attrs)})
ds = xr.decode_cf(ds)

test.update({'time':('time', ds['time'])})

如果你找到更简单的方法,请告诉我!我目前使用的另一个来源的研究数据集没有这个问题,但是我很好奇其他人是如何用ESRL NARR数据解决这个问题的。

余天宇
2023-03-14

此问题已在较新版本的xarray中修复。使用版本0.12,我得到以下信息

>>> ds = xr.open_dataset('air.2m.2010.nc')
.../conventions.py:394: SerializationWarning: variable 'air' has multiple fill values {9.96921e+36, -9.96921e+36}, decoding all values to NaN.

换句话说,它会引发警告,但不会引发错误,并成功地将掩码应用于两个缺少的值。

因此,您的问题可以通过升级到更新版本的xarray来解决。

 类似资料:
  • 考虑这个例子,其中主应用程序是两个模块的消费者:一个提供电子邮件服务,另一个提供日志服务。 app/email/email.service.ts app/email/email.module.ts providers: [ EmailService ], }) export class EmailModule { } 电子邮件服务api需要一些由字符串api-config标识的配置设置,由DI

  • 问题内容: app / init .py: app / models.py: 我真的不喜欢子模块依赖于其父模块。也可以避免全局包变量吗?我想要更多面向对象的解决方案。 应用程序的一种替代方法是使用我认为的“蓝图”,但是随后我松开了路线装饰器。同样,对于使用SQLAlchemy的数据库也无法做到这一点(或者可以吗?)。 问题答案: 看一下这个项目:https : //github.com/slori

  • 我试图在Laravel中加入3个表后查看特定表的日期。但是它只显示一个表的信息。 下面是连接3个表的代码: 路由文件: 下面是查看刀片模板中信息的脚本 刀片中的代码: 这里我想查看发票的创建日期,但它显示了subscribers表中订户的创建日期。但我想从发票表中查看发票的具体日期。 我该怎么做?当做

  • 问题内容: 最近,我被分配创建拍卖系统的任务。在我的工作中,我遇到了无数次由于列名不明确而导致包含联接的SQL查询无法执行的情况。考虑以下(简化的)拍卖表结构: 表: (创建拍卖的用户的ID) 表: (添加项目的用户的ID) (有该物品的拍卖的ID) (初始价格) 表: 表: (出价的用户的ID) (已提高价格的项目) (优惠价格) 如您所见,有许多列具有冲突的名称。连接这些表需要采取一些措施来消

  • 我们使用一个停靠的postgres数据库,并让hibernate自动生成用于集成测试的表(使用spring.jpa.hibernate.ddl-auto:create)。使用H2之类的东西不是一种选择,因为我们在少数地方执行一些特定于数据库的操作,例如原生SQL查询。 当所有实体都使用自动递增的id时,有什么方法可以避免id冲突吗?或者通过抵消起始id,或者更好的是让所有表使用共享序列? 模式是在

  • 我想更新表中几行的主键。如果所有行都已更新,则键将再次是唯一的,但第一行的更新会导致与第二行的键发生临时冲突。有没有优雅的方法来解决这个问题? 例子: 错误:重复的键值违反了唯一约束“pk_erichtest”