【问题标题】:Read NetCDF file in python在 python 中读取 NetCDF 文件
【发布时间】:2019-04-26 11:01:51
【问题描述】:

我正在尝试从 IRI/LDEO 气候数据库 (dust_pm25_sconc10_mon) 读取 NetCDF 文件,但我在读取该文件时遇到问题。当我选择构成数据库的变量(经度 (X)、纬度 (Y) 和时间 (T))时,X 和 Y 的输出是一个具有观察数(1、2、...、139例如)。也就是说,经度和纬度的值没有正确导出。

有人可以帮我解决这个问题吗?我已经尝试使用 R、Python 和 Qgis 读取这个文件,并且在所有这三个中,X 和 Y 的输出都是相同的。

我的代码如下(Python)。

非常感谢大家。

from netCDF4 import Dataset as dt

filestr = 'dust_pm25_sconc10_mon.nc'

ncfile = dt(filestr, 'r')

print(ncfile.variables)

lat = ncfile.variables['Y'][:]
lat

lon = ncfile.variables['X'][:]
lon

time = ncfile.variables['T'][:]
time

【问题讨论】:

    标签: python netcdf4


    【解决方案1】:

    编辑:

    这个文件有三个自变量,X、Y、T。X和Y的值特意从1变为len(X)和len(Y)。

    查看文件描述: http://iridl.ldeo.columbia.edu/home/.nasa_roses_a19/.Dust_model/.dust_mon_avg/.dust_pm25_sconc10_mon/

    自变量(网格)
    时间
    网格:/T(自 1960 年 1 月 1 日起的几个月)按 1.0 N= 373 点排序(1979 年 3 月)到(2010 年 3 月):网格
    经度
    网格:/X(无单位)按 1.0 排序 (1.0) 到 (191.0) N= 191 pts :grid
    纬度
    网格:/Y(无单位)按 1.0 N= 139 pts 排序 (1.0) 到 (139.0) :grid

    当然,这对经度可能有意义,但对于纬度,这是无稽之谈。不幸的是,我没有找到任何提示该数据集应该描述这个星球上的哪个区域。

    但是,我也没有在它的唯一因变量 dust_pm25_sconc10_mon 中找到 任何 数据 - 它是空的。

    PS:举个例子:
    这个数据集在这里 http://iridl.ldeo.columbia.edu/home/.nasa_roses_a19/.Dust_model/.RegDustModelProjected/.dust_pm25_sconc10/datafiles.html
    看起来更合理...

    单独的描述更有希望:

    自变量(网格)
    时间(时间)
    网格:/T(自 2009-01-02 00:00 以来的天数)按 0.125 订购(0130-0430 2009 年 1 月 2 日)至(2230 2010 年 4 月 1 日 - 0130 2010 年 4 月 2 日) N= 3640 分:grid
    经度
    网格:/X (degree_east) 按 0.625 N= 120 pts 排序 (19.6875W) 到 (54.6875E) :grid
    纬度
    grid: /Y (degree_north) 以 0.625 N= 64 pts 排序 (0.3125N) 到 (39.6875N) :grid

    而且它的因变量dust_pm25_sconc10也不为空。


    我真的试图在你提到的网站上找到这个文件,但它是徒劳的。所以在不知不觉中,我不得不猜测:

    netcdf 文件提供了通过缩放和移动任何变量的值来节省数据空间的可能性,以便可以存储它们,例如作为int 而不是float
    您可以简单地检查,是否有属性 add_offset 不是 0 和 scale_factor 不是 1。

    有关此概念的更多信息,您可以参考https://www.unidata.ucar.edu/software/netcdf/workshops/2010/bestpractices/Packing.html

    虽然上面链接中的信息表明 netcdf 的 java 接口会自动应用这些属性,但 netcdf4-python 库不会。因此,如果您想继续使用此软件包,则必须按照所述重新调整数据并将数据偏移回原始值。

    但是,您也可以考虑尝试 xarray,这是一个实现 netcdf 文件的 n 维数据结构的库,据我所知,该库根据上述规则进行自动缩放和偏移。
    http://xarray.pydata.org/en/stable/

    【讨论】:

    【解决方案2】:

    您在对 SpghttCd 的回复的评论中链接的 http://iridl.ldeo.columbia.edu/home/.nasa_roses_a19/.Dust_model/.dust_mon_avg/.dust_pm25_sconc10_mon/datafiles.html 的示例文件格式不正确。一方面,X 和 Y 数组没有适合此类维度的单位属性,而是都有值“单位”。正如已经指出的那样,数组中的值无论如何“看起来”都不是有效的。此外,该文件中的dust_pm25_sconc10_mon 数组中的值似乎都是NaN。

    另一方面,SpghttCd 引用的http://iridl.ldeo.columbia.edu/home/.nasa_roses_a19/.Dust_model/.RegDustModelProjected/.dust_pm25_sconc10/datafiles.html 的示例数据集具有良好的单位属性信息(分别为“degrees_east”和“degrees_north”)。此外,X 和 Y 数组中的实际值看起来不错。我在该数据集中绘制了dust_pm25_sconc10 变量的图(使用Panoply)并查看映射到适当区域的数据没有问题。

    SpghttCd 关于缩放和偏移的 cmets 不适用于此处,因为那一秒的经度和纬度,好的文件具有实际的 lon 和 lat 值。

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2013-09-08
      • 2014-04-12
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多