一、什么是 netCDFnetCDFNetwork Common Data Form是一种用于存储和共享面向数组的科学数据的文件格式广泛应用于气象、海洋、地球科学等领域。文件扩展名通常为.nc。netCDF 数据中存储三种核心数据数据类型说明类比维度Dimension描述数据的坐标轴信息如经度、纬度、时间、高度类似函数中的自变量变量Variable由一个或多个维度组成的数据数组类似函数的函数值属性Attribute对维度和变量的描述信息如单位、缺测值类似自变量和函数值的单位标注用函数来类比v f(x, y, z) │ └──┬──┘ │ └── 维度x(经度), y(纬度), z(时间) └── 变量如降水量、温度等 └── 属性单位(kg/m²)、缺测值(9999)等二、netCDF 解决了什么问题传统 GeoTIFF 格式存储的是二维栅格数据无法原生描述时间维度。要表示多个时间步的数据需要多个.tif文件且时间信息只能靠文件名约定来携带。netCDF 通过维度定义数据的坐标轴经度、纬度、时间、高度等变量存储实际数据天然支持多维时空数据的组织与查询便于进行时空分析。# GeoTIFF 方式多个独立文件时间靠文件名约定 precip_2026060800.tif precip_2026060801.tif precip_2026060802.tif ... # netCDF 方式一个文件内含完整时空数据 precip.nc ├── 维度: lat(321), lon(411), time(24) ├── 变量: precipitation(lat, lon, time) └── 属性: unitskg/m², _FillValue-9999三、netCDF 文件的内部结构一个 netCDF 文件的逻辑结构如下netCDF 文件 ├── 维度 (Dimensions) │ ├── lat_0 — 纬度轴321 个点 │ ├── lon_0 — 经度轴411 个点 │ └── time — 时间轴可选 │ ├── 变量 (Variables) │ ├── lat_0(float) → 属性: units, axis │ ├── lon_0(float) → 属性: units, axis │ └── APCP_P0_L1_GLL0(float, dim[lat_0, lon_0]) │ └── 属性: unitskg m-2, _FillValue-9999 │ └── 全局属性 (Global Attributes) ├── Conventions ├── history └── institution3.1 维度Dimension维度定义了数据在每个方向上的大小。每个维度有一个名称和一个长度。坐标变量Coordinate Variable与维度同名的变量存储该维度的具体取值。例如维度lat_0有 321 个点对应的坐标变量存储了38.0, 38.05, 38.10, ..., 54.0的具体纬度值。3.2 变量Variable变量是 netCDF 中的核心数据载体由一个或多个维度组成。示例APCP_P0_L1_GLL0累计降水量 形状(321, 411) —— 即 321 行 × 411 列的二维数组 维度lat_0 × lon_0 含义某一时刻每个网格点上的降水量变量的命名通常来自数据生产方的约定例如 GRIB 格式转换而来的APCP_P0_L1_GLL0表示累计降水Accumulated Precipitation。3.3 属性Attribute属性是键值对形式的元数据用于描述维度、变量或整个文件。属性位置示例键示例值说明变量属性unitskg m-2数据单位变量属性_FillValue-9999缺测填充值变量属性long_nameTotal precipitation变量的可读名称全局属性ConventionsCF-1.6遵循的元数据规范四、在 Python 中解析 netCDFPython 中一般使用xarray库解析 netCDF 文件。4.1 基本读取importxarrayasxr dsxr.open_dataset(precip.nc)print(ds)xr.open_dataset()将 netCDF 文件读取为Dataset对象包含以下组成部分组成部分说明对应关系Dimensions维度名称及其大小直接对应 nc 文件中的维度定义Coordinates维度的具体取值对应坐标变量存储的值Data Variables数据变量多维数组 维度绑定 坐标信息 自身属性对应 nc 文件中的非坐标变量每个变量是一个DataArray对象Attributes全局属性键值对对应 nc 文件的全局属性4.2 查看数据结构# 查看维度信息print(ds.dims)# Frozen({time: 24, lat_0: 321, lon_0: 411})# 查看坐标值print(ds.coords)# Coordinates:# * lat_0 (lat_0) float32 38.0 38.05 38.1 ... 53.95 54.0# * lon_0 (lon_0) float32 115.0 115.05 ... 135.45 135.5# 查看变量print(ds.data_vars)# Data variables:# APCP_P0_L1_GLL0 (time, lat_0, lon_0) float32 ...# 查看变量属性print(ds[APCP_P0_L1_GLL0].attrs)# {units: kg m-2, long_name: Total precipitation, ...}4.3 数据选取与切片# 选取某个变量precipds[APCP_P0_L1_GLL0]# 按时间切片precip_t0precip.isel(time0)# 按索引选取第 0 个时间步precip_selprecip.sel(time2026-06-08)# 按标签选取按坐标的实际值如 2026-06-08 这个时间点# 按空间范围裁剪precip_regionprecip.sel(lat_0slice(38.0,54.0),lon_0slice(115.0,135.5))# 转为 NumPy 数组arrprecip_t0.values# shape: (321, 411)4.4 数据清洗实际业务中netCDF 数据常包含缺测值或异常值需要在使用前清洗importnumpyasnp# 方式一通过 _FillValue 自动处理dsxr.open_dataset(precip.nc)# xarray 会自动将 _FillValue 替换为 NaN# 方式二手动处理特定缺测值如 9999 不是标准 _FillValue 时precipprecip.where(precip!9999)# 9999 → NaNprecipprecip.where(precip0,0)# 负值误差 → 0precipprecip.fillna(0)# NaN → 0适用于累计场景注意在本项目的降水数据中9999大量出现但并非_FillValue必须手动处理否则累计计算会被严重污染。4.5 关闭文件ds.close()# 或使用 with 语句自动关闭withxr.open_dataset(precip.nc)asds:precipds[APCP_P0_L1_GLL0].values五、netCDF 与其他格式的对比特性netCDF (.nc)GeoTIFF (.tif)HDF5 (.h5)GRIB多维数据原生支持仅 2D原生支持原生支持时间维度原生支持不支持需自行组织原生支持自描述元数据有有限有有跨平台是是是是生态支持Python/Fortran/CGDAL/QGISPython/C较专用压缩支持支持支持支持典型场景气象/海洋/气候遥感/GIS科学计算气象预报六、常见 netCDF 变量命名约定6.1 CF 命名规范Climate and Forecast遵循 CF 规范的 netCDF 文件使用标准化的变量名和属性名变量名含义单位pr降水率Precipitation Ratekg m-2 s-1prc对流降水率kg m-2 s-1tas近地面气温Kuas近地面 U 风速m s-1vas近地面 V 风速m s-1psl海平面气压Pa6.2 GRIB 转换命名从 GRIB 格式转换而来的 netCDF 文件通常保留 GRIB 风格的命名变量名含义APCP_P0_L1_GLL0地面累计降水Accumulated PrecipitationTMP_P0_L1_GLL0地面温度TemperatureUGRD_P0_L1_GLL0U 方向风速VGRD_P0_L1_GLL0V 方向风速坐标变量也可能命名为lat_0/lon_0而非标准的lat/lon。七、参考资源【python】xarray(1): netCDF(NC)格式解读与读取 - 知乎](https://zhuanlan.zhihu.com/p/393392465)
【netCDF】 数据格式理解
一、什么是 netCDFnetCDFNetwork Common Data Form是一种用于存储和共享面向数组的科学数据的文件格式广泛应用于气象、海洋、地球科学等领域。文件扩展名通常为.nc。netCDF 数据中存储三种核心数据数据类型说明类比维度Dimension描述数据的坐标轴信息如经度、纬度、时间、高度类似函数中的自变量变量Variable由一个或多个维度组成的数据数组类似函数的函数值属性Attribute对维度和变量的描述信息如单位、缺测值类似自变量和函数值的单位标注用函数来类比v f(x, y, z) │ └──┬──┘ │ └── 维度x(经度), y(纬度), z(时间) └── 变量如降水量、温度等 └── 属性单位(kg/m²)、缺测值(9999)等二、netCDF 解决了什么问题传统 GeoTIFF 格式存储的是二维栅格数据无法原生描述时间维度。要表示多个时间步的数据需要多个.tif文件且时间信息只能靠文件名约定来携带。netCDF 通过维度定义数据的坐标轴经度、纬度、时间、高度等变量存储实际数据天然支持多维时空数据的组织与查询便于进行时空分析。# GeoTIFF 方式多个独立文件时间靠文件名约定 precip_2026060800.tif precip_2026060801.tif precip_2026060802.tif ... # netCDF 方式一个文件内含完整时空数据 precip.nc ├── 维度: lat(321), lon(411), time(24) ├── 变量: precipitation(lat, lon, time) └── 属性: unitskg/m², _FillValue-9999三、netCDF 文件的内部结构一个 netCDF 文件的逻辑结构如下netCDF 文件 ├── 维度 (Dimensions) │ ├── lat_0 — 纬度轴321 个点 │ ├── lon_0 — 经度轴411 个点 │ └── time — 时间轴可选 │ ├── 变量 (Variables) │ ├── lat_0(float) → 属性: units, axis │ ├── lon_0(float) → 属性: units, axis │ └── APCP_P0_L1_GLL0(float, dim[lat_0, lon_0]) │ └── 属性: unitskg m-2, _FillValue-9999 │ └── 全局属性 (Global Attributes) ├── Conventions ├── history └── institution3.1 维度Dimension维度定义了数据在每个方向上的大小。每个维度有一个名称和一个长度。坐标变量Coordinate Variable与维度同名的变量存储该维度的具体取值。例如维度lat_0有 321 个点对应的坐标变量存储了38.0, 38.05, 38.10, ..., 54.0的具体纬度值。3.2 变量Variable变量是 netCDF 中的核心数据载体由一个或多个维度组成。示例APCP_P0_L1_GLL0累计降水量 形状(321, 411) —— 即 321 行 × 411 列的二维数组 维度lat_0 × lon_0 含义某一时刻每个网格点上的降水量变量的命名通常来自数据生产方的约定例如 GRIB 格式转换而来的APCP_P0_L1_GLL0表示累计降水Accumulated Precipitation。3.3 属性Attribute属性是键值对形式的元数据用于描述维度、变量或整个文件。属性位置示例键示例值说明变量属性unitskg m-2数据单位变量属性_FillValue-9999缺测填充值变量属性long_nameTotal precipitation变量的可读名称全局属性ConventionsCF-1.6遵循的元数据规范四、在 Python 中解析 netCDFPython 中一般使用xarray库解析 netCDF 文件。4.1 基本读取importxarrayasxr dsxr.open_dataset(precip.nc)print(ds)xr.open_dataset()将 netCDF 文件读取为Dataset对象包含以下组成部分组成部分说明对应关系Dimensions维度名称及其大小直接对应 nc 文件中的维度定义Coordinates维度的具体取值对应坐标变量存储的值Data Variables数据变量多维数组 维度绑定 坐标信息 自身属性对应 nc 文件中的非坐标变量每个变量是一个DataArray对象Attributes全局属性键值对对应 nc 文件的全局属性4.2 查看数据结构# 查看维度信息print(ds.dims)# Frozen({time: 24, lat_0: 321, lon_0: 411})# 查看坐标值print(ds.coords)# Coordinates:# * lat_0 (lat_0) float32 38.0 38.05 38.1 ... 53.95 54.0# * lon_0 (lon_0) float32 115.0 115.05 ... 135.45 135.5# 查看变量print(ds.data_vars)# Data variables:# APCP_P0_L1_GLL0 (time, lat_0, lon_0) float32 ...# 查看变量属性print(ds[APCP_P0_L1_GLL0].attrs)# {units: kg m-2, long_name: Total precipitation, ...}4.3 数据选取与切片# 选取某个变量precipds[APCP_P0_L1_GLL0]# 按时间切片precip_t0precip.isel(time0)# 按索引选取第 0 个时间步precip_selprecip.sel(time2026-06-08)# 按标签选取按坐标的实际值如 2026-06-08 这个时间点# 按空间范围裁剪precip_regionprecip.sel(lat_0slice(38.0,54.0),lon_0slice(115.0,135.5))# 转为 NumPy 数组arrprecip_t0.values# shape: (321, 411)4.4 数据清洗实际业务中netCDF 数据常包含缺测值或异常值需要在使用前清洗importnumpyasnp# 方式一通过 _FillValue 自动处理dsxr.open_dataset(precip.nc)# xarray 会自动将 _FillValue 替换为 NaN# 方式二手动处理特定缺测值如 9999 不是标准 _FillValue 时precipprecip.where(precip!9999)# 9999 → NaNprecipprecip.where(precip0,0)# 负值误差 → 0precipprecip.fillna(0)# NaN → 0适用于累计场景注意在本项目的降水数据中9999大量出现但并非_FillValue必须手动处理否则累计计算会被严重污染。4.5 关闭文件ds.close()# 或使用 with 语句自动关闭withxr.open_dataset(precip.nc)asds:precipds[APCP_P0_L1_GLL0].values五、netCDF 与其他格式的对比特性netCDF (.nc)GeoTIFF (.tif)HDF5 (.h5)GRIB多维数据原生支持仅 2D原生支持原生支持时间维度原生支持不支持需自行组织原生支持自描述元数据有有限有有跨平台是是是是生态支持Python/Fortran/CGDAL/QGISPython/C较专用压缩支持支持支持支持典型场景气象/海洋/气候遥感/GIS科学计算气象预报六、常见 netCDF 变量命名约定6.1 CF 命名规范Climate and Forecast遵循 CF 规范的 netCDF 文件使用标准化的变量名和属性名变量名含义单位pr降水率Precipitation Ratekg m-2 s-1prc对流降水率kg m-2 s-1tas近地面气温Kuas近地面 U 风速m s-1vas近地面 V 风速m s-1psl海平面气压Pa6.2 GRIB 转换命名从 GRIB 格式转换而来的 netCDF 文件通常保留 GRIB 风格的命名变量名含义APCP_P0_L1_GLL0地面累计降水Accumulated PrecipitationTMP_P0_L1_GLL0地面温度TemperatureUGRD_P0_L1_GLL0U 方向风速VGRD_P0_L1_GLL0V 方向风速坐标变量也可能命名为lat_0/lon_0而非标准的lat/lon。七、参考资源【python】xarray(1): netCDF(NC)格式解读与读取 - 知乎](https://zhuanlan.zhihu.com/p/393392465)