【问题标题】:Convert a numpy dataset to netCDF将 numpy 数据集转换为 netCDF
【发布时间】:2019-09-21 04:49:45
【问题描述】:

我在 python 中有一个 numpy 数组,大小 (16,250,186) 代表时间、纬度和经度。

我想将其转换为 netCDF 文件,以便我以后可以轻松地读取带有坐标的数据。

我的 numpy 数组是这样的

RZS = np.load("/home/chandra/Data/rootzone_CHIRPS_era5_2003-2015_daily-analysis_annual-result.npy")
RZS.shape

Output: (16, 250, 186)

如您所见,我上面的 numpy 数组表示 16 年的年度值。

chirps_precip =xarray.open_mfdataset("/home/chandra/Data/CHIRPS/chirps-v2.0.2000.days_p25.nc")
precip = chirps_precip.precip.sel(latitude = slice(-50,12.5), longitude = slice(-81.25,-34.75))
precip[0,:,:]

Output:
<xarray.DataArray 'precip' (latitude: 250, longitude: 186)>
dask.array<shape=(250, 186), dtype=float32, chunksize=(250, 186)>
Coordinates:
  * latitude   (latitude) float32 -49.875 -49.625 -49.375 ... 12.125 12.375
  * longitude  (longitude) float32 -81.125 -80.875 -80.625 ... -35.125 -34.875
    time       datetime64[ns] 2000-01-01
Attributes:
    units:               mm/day
    standard_name:       convective precipitation rate
    long_name:           Climate Hazards group InfraRed Precipitation with St...
    time_step:           day
    geostatial_lat_min:  -50.0
    geostatial_lat_max:  50.0
    geostatial_lon_min:  -180.0
    geostatial_lon_max:  180.0

这些是 chirps_precip 数据集的坐标,我希望我的 numpy 数组 RZS 在时间步上具有年份(如 2000、2001、.....2015)

我尝试了一些方法,例如

# from xarray
array = xarray.DataArray(RZS, latitude = 'precip.latitude')

#from netCDF
Dataset.createVariable('rootzone storage cap', np.float32, ('time','lat','lon'))

但是我什么都做不了。我还尝试复制attrscoords,但这也没有用。 好像我这样做是错误的。谁能建议我错过了什么。

我希望我的 numpy 数组与 netcdf 文件具有相同的坐标,但将 time 属性修改为年份。

【问题讨论】:

    标签: python-3.x dataset python-xarray netcdf4


    【解决方案1】:

    我建议使用模块netCDF4 之类的代码,假设您在变量latlon 中具有纬度和经度并且数据输出为dataout

    #!/usr/bin/env ipython
    # ---------------------
    import numpy as np
    import datetime
    from netCDF4 import Dataset,num2date,date2num
    # -----------------------
    nyears = 16;
    unout = 'days since 2000-01-01 00:00:00'
    # -----------------------
    ny, nx = (250, 186)
    lon = np.linspace(9,30,nx);
    lat = np.linspace(50,60,ny);
    
    dataout = np.random.random((nyears,ny,nx)); # create some random data
    datesout = [datetime.datetime(2000+iyear,1,1) for iyear in range(nyears)]; # create datevalues
    # =========================
    ncout = Dataset('myfile.nc','w','NETCDF3'); # using netCDF3 for output format 
    ncout.createDimension('lon',nx);
    ncout.createDimension('lat',ny);
    ncout.createDimension('time',nyears);
    lonvar = ncout.createVariable('lon','float32',('lon'));lonvar[:] = lon;
    latvar = ncout.createVariable('lat','float32',('lat'));latvar[:] = lat;
    timevar = ncout.createVariable('time','float64',('time'));timevar.setncattr('units',unout);timevar[:]=date2num(datesout,unout);
    myvar = ncout.createVariable('myvar','float32',('time','lat','lon'));myvar.setncattr('units','mm');myvar[:] = dataout;
    ncout.close();
    

    xarray相比,您需要编写更多代码,但使用该模块创建netCDF文件仍然非常容易。

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2013-03-04
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多