GCMs d的重新填充/重新映射

2024-05-18 21:41:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个降水数据在一个netCDF文件,我已经从CMIP5数据库下载。我能够制作文件的一个子集,并获得下面给出的属性。这些数据具有2.5 X 3.75度的空间分辨率。现在我需要把它转换成0.05度的空间分辨率。有没有人可以帮助我写下如何使用Python。你知道吗

请记住,我在windows机器上使用python3.7。CDO或NCO不适合windows。数据属性在这里。你知道吗

Dimensions:    (bnds: 2, lat: 15, lon: 13, time: 122)
Coordinates:
  * time       (time) float64 15.0 45.0 75.0 ... 3.585e+03 3.615e+03 3.645e+03
  * lat        (lat) float64 -42.5 -40.0 -37.5 -35.0 ... -15.0 -12.5 -10.0 -7.5
  * lon        (lon) float64 112.5 116.2 120.0 123.8 ... 146.2 150.0 153.8 157.5

Dimensions without coordinates: bnds
Data variables:
    time_bnds  (time, bnds) float64 ...
    lat_bnds   (lat, bnds) float64 ...
    lon_bnds   (lon, bnds) float64 ...
    pr         (time, lat, lon) float32 ...

如果有人能帮助我,我将不胜感激。提前谢谢。你知道吗


Tags: 文件数据属性timewindows分辨率空间netcdf
1条回答
网友
1楼 · 发布于 2024-05-18 21:41:19

我可以用一些随机数据提出这样的解决方案,在这里我将网格数据从一个分辨率重新划分到另一个分辨率。你知道吗

#!/usr/bin/env ipython
#           -
import numpy as np
from netCDF4 import Dataset,num2date,date2num
#               -
ntime,nlon,nlat=10,10,10;
lonin=np.linspace(0.,1.,10);
latin=np.linspace(0.,1.,10);
dataout=np.random.random((ntime,nlat,nlon));
unout='seconds since 2018-01-01 00:00:00'
#           -
# make data:
ncout=Dataset('in.nc','w','NETCDF3_CLASSIC');
ncout.createDimension('lon',nlon);
ncout.createDimension('lat',nlat);
ncout.createDimension('time',None);
ncout.createVariable('lon','float32',('lon'));ncout.variables['lon'][:]=lonin;
ncout.createVariable('lat','float32',('lat'));ncout.variables['lat'][:]=latin;
ncout.createVariable('time','float64',('time'));ncout.variables['time'].setncattr('units',unout);ncout.variables['time'][:]=np.linspace(0,3600*ntime,ntime);
ncout.createVariable('randomdata','float32',('time','lat','lon'));ncout.variables['randomdata'][:]=dataout;
ncout.close()
#            
# regrid:
from scipy.interpolate import griddata
lonout=np.linspace(0.,1.,20);
latout=np.linspace(0.,1.,20);
ncout=Dataset('out.nc','w','NETCDF3_CLASSIC');
ncout.createDimension('lon',np.size(lonout));
ncout.createDimension('lat',np.size(latout));
ncout.createDimension('time',None);
ncout.createVariable('lon','float32',('lon'));ncout.variables['lon'][:]=lonout;
ncout.createVariable('lat','float32',('lat'));ncout.variables['lat'][:]=latout;
ncout.createVariable('time','float64',('time'));ncout.variables['time'].setncattr('units',unout);ncout.variables['time'][:]=np.linspace(0,3600*ntime,ntime);
ncout.createVariable('randomdata','float32',('time','lat','lon'));
ncin=Dataset('in.nc');
lonin=ncin.variables['lon'][:];latin=ncin.variables['lat'][:];
lonmin,latmin=np.meshgrid(lonin,latin);
lonmout,latmout=np.meshgrid(lonout,latout);
for itime in range(np.size(ncin.variables['time'][:])):
    zout=griddata((lonmin.flatten(),latmin.flatten()),ncin.variables['randomdata'][itime,:,:].flatten(),(lonmout,latmout),'linear');
    ncout.variables['randomdata'][itime,:]=zout;
ncin.close();ncout.close()

相关问题 更多 >

    热门问题