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

Python的open_mfdataset以一种意想不到的方式工作

欧阳楚
2023-03-14

我有365份1980年的每日netCDF文件。这些文件位于一个包含多年(1979-2013年)数据的文件夹中。

当我使用 1980 文件打开时,

files  = glob.glob("/mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/Subset/data_1980*")
ds = xarray.open_mfdataset(files, engine="netcdf4")

时间戳似乎不正确。当我打印出时间时,我得到以下信息:

ds.time.sortby("time")
Out[28]: 
<xarray.DataArray 'time' (time: 3286)>
array(['1979-01-07T00:00:00.000000000', '1979-01-07T03:00:00.000000000',
       '1979-01-07T06:00:00.000000000', ..., '2013-12-23T18:00:00.000000000',
       '2013-12-23T21:00:00.000000000', '2013-12-24T00:00:00.000000000'], dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1979-01-07 1979-01-07T03:00:00 ...
Attributes:
    standard_name:  time
    axis:           T

为了检查文件夹中的其他文件是否正在被读取,我更改了文件夹的内容(即我删除了2012年的文件),但我仍然得到与以前相同的时间序列。我不确定出了什么问题!

Out[29]: 
<xarray.DataArray 'time' (time: 3286)>
array(['1979-01-07T00:00:00.000000000', '1979-01-07T03:00:00.000000000',
       '1979-01-07T06:00:00.000000000', ..., '2013-12-23T18:00:00.000000000',
       '2013-12-23T21:00:00.000000000', '2013-12-24T00:00:00.000000000'], dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1979-01-07 1979-01-07T03:00:00 ...
Attributes:
    standard_name:  time
    axis:           T

NetCDF数据的元数据如下(使用ncdump-h):

svimal@lettenmaierlab06:/mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/Subset$ ncdump -h data_19800530.nc
netcdf data_19800530 {
dimensions:
    lon = 503 ;
    lat = 170 ;
    time = UNLIMITED ; // (1 currently)
variables:
    double lon(lon) ;
        lon:standard_name = "longitude" ;
        lon:long_name = "longitude" ;
        lon:units = "degrees_east" ;
        lon:axis = "X" ;
    double lat(lat) ;
        lat:standard_name = "latitude" ;
        lat:long_name = "latitude" ;
        lat:units = "degrees_north" ;
        lat:axis = "Y" ;
    double time(time) ;
        time:standard_name = "time" ;
        time:units = "hours since 1999-5-16 00:00:00" ;
        time:calendar = "standard" ;
        time:axis = "T" ;
    float air_temp(time, lat, lon) ;
        air_temp:long_name = "air temperuature (C)" ;
        air_temp:_FillValue = -9.99e+08f ;
        air_temp:missing_value = -9.99e+08f ;
    float vp(time, lat, lon) ;
        vp:long_name = "vapor pressure (kPa)" ;
        vp:_FillValue = -9.99e+08f ;
        vp:missing_value = -9.99e+08f ;
    float pressure(time, lat, lon) ;
        pressure:long_name = "pressure (kPa)" ;
        pressure:_FillValue = -9.99e+08f ;
        pressure:missing_value = -9.99e+08f ;
    float windspd(time, lat, lon) ;
        windspd:long_name = "wind (m/s)" ;
        windspd:_FillValue = -9.99e+08f ;
        windspd:missing_value = -9.99e+08f ;
    float shortwave(time, lat, lon) ;
        shortwave:long_name = "downward shortwave (W/m^2)" ;
        shortwave:_FillValue = -9.99e+08f ;
        shortwave:missing_value = -9.99e+08f ;
    float longwave(time, lat, lon) ;
        longwave:long_name = "downward longwave (W/m^2)" ;
        longwave:_FillValue = -9.99e+08f ;
        longwave:missing_value = -9.99e+08f ;
    float precip(time, lat, lon) ;
        precip:long_name = "precipitation (mm/hr)" ;
        precip:_FillValue = -9.99e+08f ;
        precip:missing_value = -9.99e+08f ;

// global attributes:
        :CDI = "Climate Data Interface version ?? (http://mpimet.mpg.de/cdi)" ;
        :Conventions = "CF-1.4" ;
        :history = "Tue Mar 20 14:36:48 2018: ncea -d lat,41.375,83.625 -d lon,181.375,306.875 /mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/data_19800530.nc /mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/Subset/data_19800530.nc\n",
            "Tue Mar 20 14:36:44 2018: cdo -f nc import_binary /mnt/nfs/home/solomon/Data/CFSR/CFSR-LAND_Global_0.25deg_data_changed.ctl /mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/data_19800530.nc" ;
        :CDO = "Climate Data Operators version 1.7.0 (http://mpimet.mpg.de/cdo)" ;
        :NCO = "\"4.5.4\"" ;
        :nco_openmp_thread_number = 1 ;
}

时间属性说

time = UNLIMITED ; // (1 currently)

我不知道这意味着什么,这可能是问题所在吗?

共有2个答案

赵同
2023-03-14

谢谢@shoyer!问题是我的文件。以“1980”开头的文件名包含其他年份的数据。这是因为我修改了同一个输入控制文件来并行创建多个netcdf文件,使用了:

cdo -f nc import_binary CFSR-LAND_Global_0.25deg_data_changed.ctl data_19800530.nc

为每个并行线程创建唯一的 ctl 文件解决了这个问题。

祝灼光
2023-03-14

你确定你对glob.glob()的使用只返回1980年的netCDF文件吗?

我建议使用显式循环进行抽查(跳过< code>open_mfdataset):

files = glob.glob("/mnt/nfs/home/solomon/Data/CFSR/NetCDFs_1979-2013/Subset/data_1980*")
for path in files:
    ds = xarray.open_dataset(path, engine="netcdf4")
    print(path, ds.time.values)

附注:最好将glob字符串直接传递到< code>open_mfdataset()中,而不是显式调用< code>glob.glob()。它稍微简洁一些,xarray还对它解析的glob字符串调用< code>sorted(),而不是依赖于由< code>glob.glob()返回的列表的平台特定顺序。

 类似资料:
  • 本文向大家介绍求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m相关面试题,主要包含被问及求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m时的应答技巧和注意事项,需要的朋友参考一下 答:  

  • 我只有java版本1.8.0_45()。所以,你建议的解决方案不能解决我的问题。 当我运行应用程序时,它会抛出以下错误: 意外的顶级异常:错误:com.android.dx.cf.iface。ParseException:com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)处的坏类文件magic(cafe

  • 有没有可能字典在这个问题上比蛮力慢? > 为正整数集定义以下迭代序列: <代码>n→ n/2(n为偶数) <代码>n→ 3n 1(n为奇数) 使用上述规则,从13开始,我们生成以下序列: 可以看出,该序列(从13开始,到1结束)包含10个术语。虽然这还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束。 100万以下的哪个起始数字产生的链条最长? 注:一旦链开始,条款允许超过一百万。 代

  • 我正在尝试用Django创建一个电话簿。我的网址。py: 意见。py: 从models.py: 和列表。html: 索引看起来不错,但当我尝试单击链接以获取个人详细信息网站时,我收到以下消息: /phonebook/4/person\u detail()处的TypeError获取了意外的关键字参数“id”请求方法:获取请求URL:http://127.0.0.1:8000/phonebook/4/

  • 我需要一些帮助,你知道那些“重复直到”的障碍吗?我需要知道如何在python中做到这一点。我想做的是,用一个重复块。

  • 我在做一个程序,制作一些关于新冠病毒病例的图表,遇到了一些问题。代码应该显示三个图形,但只显示两个。有人能帮我找出这里的错误吗? 错误:TypeError:choropleth()获取了意外的关键字参数“location” 代码: