使用“datatime”库将NetCDF编写代码从年度转换为月度

2024-03-28 18:20:38 发布

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

我有一个形状为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();

有人能帮我把代码从每年改成每月吗?你知道吗


Tags: datadatetimetimeresnetcdflonlatfloat32
1条回答
网友
1楼 · 发布于 2024-03-28 18:20:38

您应该使用月份数作为时间轴的大小,即维度的长度。所以,如果你有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();

相关问题 更多 >