使用 'datatime' 库将 NetCDF 编写代码从年度转换为每月
Convert the NetCDF writing code from annual to monthly using 'datatime' library
我有一个形状为 180 x 360 x 720 的 NetCDF 文件。保存数据时,180 指的是从“2001 年到 2015 年”的 12 个月,360 和 720 指的是中心纬度和经度,范围从 89.75 度到 -分别为89.75度和-179.75度到179.75度0.5度间隔。
我想使用 datetime
包将其写入 NetCDF。
我写年度数据的代码如下:
import datetime
from netCDF4 import Dataset,num2date,date2num
# -----------------------
nyears = 15; ## From 2001-2015 but time axis is 180 in shape
unout = 'days since 2001-01-01 00:00:00'
# -----------------------
res = 0.5
lon = np.arange(-179.75,180,res);
lat = np.arange(-89.75,-90,res);
dataout = X; # create some random data
datesout = [datetime.datetime(2001+iyear,1,1) for iyear in range(nyears)]; # create datevalues
# =========================
ncout = Dataset('/home/chandra/data/Temp_data_evap/BESS_ET.nc','w','NETCDF4'); # 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('Evaporation','float32',('time','lat','lon'));myvar.setncattr('units','mm');myvar[:] = dataout;
ncout.close();
谁能帮我把代码从每年改成每月?
您应该使用月数作为时间轴的大小,即维度的长度。因此,如果您有 15 年的月度数据,则时间上有 15*12 = 180 个值。
示例代码如下:
#!/usr/bin/env ipython
import datetime
from netCDF4 import Dataset,num2date,date2num
import numpy as np
# -------------------------------------------------
# Make date axis:
yystart = 2001
nyears = 15
monperyear = 12
ntime = nyears*monperyear
unout = 'days since 2001-01-01 00:00:00'
# -------------------------------------------------
res = 0.5
lon = np.arange(-179.75,180,res);nx=np.size(lon)
lat = np.arange(-89.75,90,res);ny=np.size(lat)
dataout = np.random.random((ntime,ny,nx))
datesout = [datetime.datetime(yy,mm,15,0) for yy in range(yystart,yystart+nyears) for mm in range(1,13)]
# =========================
ncout = Dataset('BESS_ET.nc','w','NETCDF4'); # using netCDF3 for output format
ncout.createDimension('lon',nx);
ncout.createDimension('lat',ny);
ncout.createDimension('time',ntime);
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('Evaporation','float32',('time','lat','lon'));myvar.setncattr('units','mm');myvar[:] = dataout;
ncout.close();
我有一个形状为 180 x 360 x 720 的 NetCDF 文件。保存数据时,180 指的是从“2001 年到 2015 年”的 12 个月,360 和 720 指的是中心纬度和经度,范围从 89.75 度到 -分别为89.75度和-179.75度到179.75度0.5度间隔。
我想使用 datetime
包将其写入 NetCDF。
我写年度数据的代码如下:
import datetime
from netCDF4 import Dataset,num2date,date2num
# -----------------------
nyears = 15; ## From 2001-2015 but time axis is 180 in shape
unout = 'days since 2001-01-01 00:00:00'
# -----------------------
res = 0.5
lon = np.arange(-179.75,180,res);
lat = np.arange(-89.75,-90,res);
dataout = X; # create some random data
datesout = [datetime.datetime(2001+iyear,1,1) for iyear in range(nyears)]; # create datevalues
# =========================
ncout = Dataset('/home/chandra/data/Temp_data_evap/BESS_ET.nc','w','NETCDF4'); # 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('Evaporation','float32',('time','lat','lon'));myvar.setncattr('units','mm');myvar[:] = dataout;
ncout.close();
谁能帮我把代码从每年改成每月?
您应该使用月数作为时间轴的大小,即维度的长度。因此,如果您有 15 年的月度数据,则时间上有 15*12 = 180 个值。
示例代码如下:
#!/usr/bin/env ipython
import datetime
from netCDF4 import Dataset,num2date,date2num
import numpy as np
# -------------------------------------------------
# Make date axis:
yystart = 2001
nyears = 15
monperyear = 12
ntime = nyears*monperyear
unout = 'days since 2001-01-01 00:00:00'
# -------------------------------------------------
res = 0.5
lon = np.arange(-179.75,180,res);nx=np.size(lon)
lat = np.arange(-89.75,90,res);ny=np.size(lat)
dataout = np.random.random((ntime,ny,nx))
datesout = [datetime.datetime(yy,mm,15,0) for yy in range(yystart,yystart+nyears) for mm in range(1,13)]
# =========================
ncout = Dataset('BESS_ET.nc','w','NETCDF4'); # using netCDF3 for output format
ncout.createDimension('lon',nx);
ncout.createDimension('lat',ny);
ncout.createDimension('time',ntime);
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('Evaporation','float32',('time','lat','lon'));myvar.setncattr('units','mm');myvar[:] = dataout;
ncout.close();