现在处理nc文件,尤其是业务化的时候,用xarray模块的比较多,因为速度更快,而且也更稳定。但是netCDF4模块也很常用,事实上我们有很多既有代码就是基于netCDF4写的。这里存一下netCDF4模式写nc文件的代码:
import numpy as np
import sys
import os
from netCDF4 import Dataset
import time
from datetime import datetime, timedelta
from netCDF4 import num2date, date2num
def creatspinc(value, filename):
gridspi = Dataset(filename, 'w', format='NETCDF4')
gridspi.createDimension('time', None)
gridspi.createDimension('lat', 1000)
gridspi.createDimension('lon', 2000)
times = gridspi.createVariable('time', np.float64, ('time',))
latitudes = gridspi.createVariable('lat', np.float32, ('lat',))
longitudes = gridspi.createVariable('lon', np.float32, ('lon',))
var = gridspi.createVariable('var', np.float32, ('time', 'lat', 'lon',))
gridspi.description = 'var'
gridspi.history = 'Created ' + time.ctime(time.time())
gridspi.source = 'netCDF4 python module tutorial'
latitudes.units = 'degree_north'
longitudes.units = 'degree_east'
times.units = 'days since 2019-01-01 00:00:00'
times.calendar = 'gregorian'
lats = np.linspace(25.,35.,1000)
lons = np.linspace(95.,115.,2000)
latitudes[:] = lats
longitudes[:] = lons
var[0:value.shape[0],:,:] = value
dates = []
for n in range(var.shape[0]):
dates.append(datetime(2019, 1, 1) + n * timedelta(days=1))
times[:] = date2num(dates, units = times.units,calendar = times.calendar)
print 'time values (in units %s): ' % times.units +'\n', times[:]
dates = num2date(times[:], units=times.units, calendar=times.calendar)
gridspi.close()
return
if __name__ == '__main__':
out_dir='~/'
out_file_nc = out_dir+'out.nc'
data_nc = np.zeros(shape=(61,1000,2000))
creatspinc(data_nc, out_file_nc)