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

xarray自动将_FillValue应用于netCDF输出上的坐标

燕飞文
2023-03-14

我正在尝试创建符合cf的netcdf文件。我可以让它与xarray兼容98%的cf,但我遇到了一个问题。当我对正在创建的文件执行ncdump时,我会看到以下内容:

float lon(lon) ;
    lon:_FillValue = NaNf ;
    lon:long_name = "Longitude" ;
    lon:standard_name = "longitude" ;
    lon:short_name = "lon" ;
    lon:units = "degrees_east" ;
    lon:axis = "X" ;
    lon:valid_min = -180.f ;
    lon:valid_max = 180.f ;
float lat(lat) ;
    lat:_FillValue = NaNf ;
    lat:long_name = "Latitude" ;
    lat:standard_name = "latitude" ;
    lat:short_name = "lat" ;
    lat:units = "degrees_north" ;
    lat:axis = "Y" ;
    lat:valid_min = -90.f ;
    lat:valid_max = 90.f ;
double time(time) ;
    time:_FillValue = NaN ;
    time:standard_name = "time" ;
    time:units = "days since 2006-01-01" ;
    time:calendar = "gregorian" ;

我的数据集的坐标是lat、lon和time。当我通过ds.to_netcdf()转换为netcdf时,所有坐标变量都会自动应用填充值,因为它们是浮点数。应用填充值的坐标变量违反cf标准(http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#attribute-附录)。

我尝试更改编码,以便不压缩这些特定变量:

import numpy as np
import xarray as xr
import pandas as pd
import datetime as dt

lons = np.arange(-75, -70, .5).astype(np.float32)
lats = np.arange(40,42, .25).astype(np.float32)
[x, y] = np.meshgrid(lons, lats)
u = np.random.randn(1, 8, 10).astype(np.float32)
v = np.random.randn(1, 8, 10).astype(np.float32)
time_index = pd.date_range(dt.datetime.now(), periods=1)

ds = xr.Dataset()
coords = ('time', 'lat', 'lon')
ds['u'] = (coords, np.float32(u))
ds['v'] = (coords, np.float32(v))
ds.coords['lon'] = lons
ds.coords['lat'] = lats
ds.coords['time'] = time_index

encoding = {'lat': {'zlib': False},
            'lon': {'zlib': False},
            'u': {'_FillValue': -999.0,
                  'chunksizes': (1, 8, 10),
                  'complevel': 1,
                  'zlib': True}
            }
ds.to_netcdf('test.nc', encoding=encoding)

或者通过改变数据类型,但我没有任何运气。我不希望使用netCDF4重新加载文件以删除_fillvalue。xarray中有没有一种解决这个问题的方法?

共有1个答案

米元凯
2023-03-14

\u FillValue:False添加到lat/lon编码中似乎有效:

encoding = {'lat': {'zlib': False, '_FillValue': False},
            'lon': {'zlib': False, '_FillValue': False},
            'u': {'_FillValue': -999.0,
                  'chunksizes': (1, 8, 10),
                  'complevel': 1,
                  'zlib': True}
            }

结果文件的ncdump-h

netcdf test {
dimensions:
    time = 1 ;
    lat = 8 ;
    lon = 10 ;
variables:
    float u(time, lat, lon) ;
        u:_FillValue = -999.f ;
    float v(time, lat, lon) ;
        v:_FillValue = NaNf ;
    float lon(lon) ;
    float lat(lat) ;
    int64 time(time) ;
        string time:units = "days since 2017-08-15 17:41:19.460662" ;
        string time:calendar = "proleptic_gregorian" ;
}
 类似资料:
  • 问题内容: Xarray是否支持numpy计算功能(例如polyfit)?还是有一种有效的方法将这些函数应用于数据集? 示例:我想计算拟合两个变量(温度和高度)的直线的斜率,以计算失效率。我有一个数据集(下面),具有这两个变量,维度为(垂直,时间,xgrid_0,ygrid_0)。 如果我提取给定时间的温度和高度,则xgrid_0,ygrid_0; 我可以使用numpy.polyfit函数。 但这

  • 我有一个来自ERA5的2m温度netcdf文件,从2000年到2019年,从04月到10月,总共有13680个时间步长和61x161个纬度。我想分别计算每年所有每日时间步长的月平均值。例如,我们将获得2000年4月、2000年5月等数据的月平均值。我用xarray resample尝试了下面的代码,但是出现了两个问题。 出于某种原因,多年来,中庸之道似乎都是如此 重采样函数创建01、02、03、1

  • 学习如何使用xarray从DFs生成netCDF文件。在几个教程和SO问题之后,我向xarray数据集添加了“常量”维度,并向xarray数据集添加了“常量”维度,但仍然存在一些问题,因为我无法将日期、时间、纬度和经度作为维度。当我进行nc转储时,它们是不正确的。 最初的方法是将txt文件导入熊猫df,然后将xr导入netCDF: 其中df2= 这工作正常,但尺寸不正确(见下文): 如果我将日期或

  • 我有一个netCDF文件。结构: 如何提取特定经纬度(比如86.45,-156.25)和时间(比如2016-01-10)的网格单元的值?精确的纬度/经度值可能不在坐标中,在这种情况下,我们需要最接近的纬度/经度值 我可以像这样提取特定经度的值: 然而,由于-20在经度坐标中不存在,因此这不起作用。

  • 很多时候,我们需要将TextView的字体自动调整到给定的边界。 可悲的是,即使有很多线程和帖子(以及建议的解决方案)在谈论这个问题(这里,这里和这里的例子),但没有一个实际工作得很好。 这就是为什么,我决定测试他们每一个直到我找到真正的交易。 我认为这样一个textView的要求应该是: > 应允许使用任何字体、字体、样式和字符集。 应同时处理宽度和高度 没有截断,除非文本不能适合,因为限制,我

  • 问题内容: 我希望能够在后续命令中使用最后执行的命令的结果。例如, 现在假设我希望能够在编辑器中打开文件,删除文件或对其进行其他操作,例如 我该怎么做?也许使用一些bash变量? 更新: 为了澄清,我不想手动分配东西。我需要的是内置的bash变量,例如 保留上一个命令的最后一个参数。我想要类似的东西,但使用最后一条命令的输出。 最终更新: 塞思的答案非常有效。请记住以下几点: 初次尝试时不要忘记