Преобразовать набор данных NumPy в NetCDF - PullRequest
1 голос
/ 02 мая 2019

У меня есть пустой массив в python с размером (16 250 186), представляющим время, широту и долготу.

Я хочу преобразовать его в файл netCDF, чтобы в будущем можно было легко читать данные с координатами.

Мой массив numy выглядит так

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

Output: (16, 250, 186)

Как вы можете видеть, мой приведенный выше массив значений представляет годовые значения за 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, которые я хочу, чтобы мой массивный массив 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'))

Но я ничего не могу сделать. Я также пытался скопировать attrs и coords, но это также не сработало. Кажется, я делаю это неправильно. Может кто-нибудь подсказать, что мне не хватает.

Я хочу, чтобы мой массив numy имел ту же координату, что и файл netcdf, но с измененным атрибутом time для лет.

1 Ответ

0 голосов
/ 03 мая 2019

Я бы предложил код, подобный модулю netCDF4, предполагая, что у вас есть широта и долгота в переменных lat и lon, а данные - 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 с помощью этого модуля.

...