netCDF4 处理nc文件总结
创建nc文件
# 数据类型包括:f4(32位浮点数),f8(64位浮点数),i1(8位符号整型),i2(16位符号整型),i4(32位符号整型),i8(64位符号整型),
# u1(8位无符号整型),u2(16位无符号整型),u4(32位无符号整型),u8(64位无符号整型),S1(单字符字符串)
with nc.Dataset(nc_name, 'w', format='NETCDF4') as fnc:
fnc.createDimension('lat', 3541) # 确定维度大小
fnc.createDimension('lon', 6165)
# 变量名 数据类型 维度大小
lat = fnc.createVariable('lat', 'f4', ('lat',)) # 创建变量
lat.long_name = "latitude" # 该变量的名称
lat.units = "degrees_north" # 该变量的单位
lon = fnc.createVariable('lon', 'f4', ('lon',))
lon.long_name = "longitude"
lon.units = "degrees_east"
# 是否压缩数据 压缩级别(1-9级) 默认初始填充值
alt = fnc.createVariable('alt', 'f4', ('lat', 'lon'), zlib=True, complevel=9, fill_value=-9999)
alt.long_name = 'height above sea level'
alt.coordinates = 'lat lon alt'
alt.units = 'meters'
alt.positive = 'up' # 高度的方向 up为向上
PRS = fnc.createVariable('PRS', 'short', ('lat', 'lon'), zlib=True, complevel=9, fill_value=-9999) # 气压
PRS.long_name = 'station pressure'
PRS.units = 'hPa'
PRS.missing_value = -9999 # 默认缺测填充
PRS.coordinates = 'lat lon alt'
PRS.add_offset = np.float32(0.0) # 增加偏移
PRS.scale_factor = np.float32(0.1) # 比例偏移 实际值存入自动扩大10倍(除以0.1),取出自动缩小10倍(乘以0.1)
PRS.valid_min = 5200 # 限制存入最小值 小于最小为缺测
PRS.valid_max = 10850 # 限制存入最大值 大于最大为缺测
# 给变量赋值 赋值的数据维度--必须和创建变量时指定的维度大小一致
fnc.variables['lat'][:] = np.arange(53.56, 18.16, -0.01)
fnc.variables['lon'][:] = np.arange(73.44, 135.09, 0.01)
fnc.variables['alt'][:] = np.array(data['alt'], dtype='float').reshape(3541, 6165)
fnc.variables['PRS'][:] = np.array(data['PRS'], dtype='float').reshape(3541, 6165)
fnc.author = 'ecoweather' # 创建文件作者
fnc.createdate = '%s' % datetime.datetime.now().strftime('%Y-%m-%d %H:%M') # 创建文件时间
创建有时间变量的nc文件
with nc.Dataset(nc_name, 'w', format='NETCDF4') as fnc: fnc.createDimension('time', 24) # 确定维度大小 fnc.createDimension('size', 10447) tt = fnc.createVariable('time', 'i4', 'time') tt.long_name = 'time' # 起始小时时间 它会自动根据你赋值的数据,从起始小时累加 tt.units = 'hours since %s' % datetime.datetime.strptime(start_time, '%Y%m%d%H%M%S').strftime('%Y-%m-%d %H:%M:%S') # 日历(公历) tt.calendar = "gregorian" sta = fnc.createVariable('sta', 'i4', ('size',)) # 创建变量 sta.coordinates = 'lat lon alt' sta.long_name = 'station number' # 站号 lat = fnc.createVariable('lat', 'f4', ('size',)) lat.long_name = "latitude" lat.units = "degrees_north" lon = fnc.createVariable('lon', 'f4', ('size',)) lon.long_name = "longitude" lon.units = "degrees_east" PRE_1m = fnc.createVariable('PRE_1m', 'f4', ('time', 'size'), zlib=True, complevel=9, fill_value=-9999) # 一分钟降水 PRE_1m.long_name = 'precipitation of 1 min' PRE_1m.units = 'mm' PRE_1m.missing_value = -9999 PRE_1m._CoordinateAxes = 'lat lon' fnc.variables['time'][:] = np.array([i for i in range(1, 25)]) fnc.variables['sta'][:] = np.array(dictknn.index.tolist()) fnc.variables['lat'][:] = np.array(dictknn['lat'].tolist()) fnc.variables['lon'][:] = np.array(dictknn['lon'].tolist()) fnc.variables['PRE_1m'][:] = np.array(data)
读取nc文件
def read_nc(ncpath: str): print('读取 nc 文件 %s' % ncpath) f = nc.Dataset(ncpath, 'r') # 获取nc文件中的变量名 var_key = list(f.variables.keys()) var_len = f.variables['lat'][:].shape # print(var_key, var_len) # 创建DataFrame存放数据,一列一类数据 nc_data = pd.DataFrame(index=range(var_len[0]), columns=var_key[1:], dtype='short') for e in var_key:
# 获取变量数据 vardata = f.variables[e][:] size = vardata.shape # print('{}-{}'.format(e, size)) # (3541, 6165) 3541行,每行6165个 if len(size) == 1: if e == 'sta': # nc_data[e] = vardata nc_data.index = vardata else: nc_data[e] = list(map(lambda s: float('%s' % s), vardata)) else: nc_data[e] = list(vardata) # print(f.variables) f.close() print(nc_data) return nc_data
创建群组
with nc.Dataset(nc_name, 'w', format='NETCDF4') as fnc: # 创建一个群组 group1 = fnc.createGroup('LatLon_1441X2880') group1.createDimension('lat', 1441) # 确定维度大小 group1.createDimension('lon', 2880) # 确定维度大小 lat1 = group1.createVariable('lat', 'f4', ('lat',), zlib=True, complevel=9, fill_value=-9999) lat1.units = "degrees_north" lon1 = group1.createVariable('lon', 'f4', ('lon',), zlib=True, complevel=9, fill_value=-9999) lon1.units = "degrees_east" group1.variables['lat'][:] = data[1441]['lat'] group1.variables['lon'][:] = data[1441]['lon'] for elem in data[1441]['value']: d = group1.createVariable(elem['name'], 'short', ('lat', 'lon'), zlib=True, complevel=9, fill_value=-9999) d.units = elem['units'] d.missing_value = -9999 d.add_offset = np.float32(0.0) d.scale_factor = np.float32(0.1) group1.variables[elem['name']][:] = elem['value'] group1.close # 关闭群组, 注意,这里没有括号 # 创建一个群组 group2 = fnc.createGroup('LatLon_281X361') group2.createDimension('lat1', 281) # 确定维度大小 group2.createDimension('lon1', 361) # 确定维度大小 lat2 = group2.createVariable('lat', 'f4', ('lat1',), zlib=True, complevel=9, fill_value=-9999) lat2.units = "degrees_north" lon2 = group2.createVariable('lon', 'f4', ('lon1',), zlib=True, complevel=9, fill_value=-9999) lon2.units = "degrees_east" group2.variables['lat'][:] = data[281]['lat'] group2.variables['lon'][:] = data[281]['lon'] for elem in data[281]['value']: d = group2.createVariable(elem['name'], 'short', ('lat1', 'lon1'), zlib=True, complevel=9, fill_value=-9999) d.units = elem['units'] d.missing_value = -9999 d.add_offset = np.float32(0.0) d.scale_factor = np.float32(0.1) group2.variables[elem['name']][:] = elem['value'] group2.close fnc.author = 'ecoweather' fnc.createdate = '%s' % datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步