• 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')
  • 相关阅读:
    屏蔽Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键(Windows 98/Me)
    获取本月第一天和最后一天的最简单的写法
    PHP程序员的优化调试技术和技巧
    Windows关机函数ExitWindowsEx使用大全(适用Windows所有操作平台)
    屏蔽Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键(Windows 98/Me)
    PHP程序员的优化调试技术和技巧
    Ajax,再生还是幻灭好文推荐
    RAID 分类
    Ajax,再生还是幻灭好文推荐
    Windows关机函数ExitWindowsEx使用大全(适用Windows所有操作平台)
  • 原文地址:https://www.cnblogs.com/luochunxi/p/14145146.html
Copyright © 2020-2023  润新知