¿Qué es NetCDF?
NetCDF — Network Common Data Form — es un conjunto de bibliotecas de software y formatos de datos autodescriptivos e independientes de la máquina, diseñados para datos científicos orientados a arrays. Desarrollado originalmente por Unidata en la Universidad Corporation for Atmospheric Research (UCAR) en 1989, NetCDF se ha convertido en el formato dominante para almacenar y compartir salidas de modelos climáticos, productos de reanálisis meteorológico, observaciones satelitales y datos oceanográficos.
Un archivo NetCDF es autodescriptivo: no solo contiene los arrays de datos, sino también metadatos que describen qué representan esos arrays — nombres de variables, unidades, coordenadas espaciales y temporales, e información de procedencia. Abrir un archivo NetCDF en cualquier herramienta compatible revela la estructura completa sin necesitar ningún esquema externo ni archivo de documentación.
El Modelo de Datos NetCDF
Todo archivo NetCDF se construye a partir de tres conceptos fundamentales:
Dimensiones — ejes con nombre y tamaño:
time = UNLIMITED; // especial: puede crecer conforme se añaden datos
lat = 721; // cuadrícula de 0,25° → 180°/0,25° + 1 = 721 filas
lon = 1440; // cuadrícula de 0,25° → 360°/0,25° = 1440 columnas
lev = 37; // 37 niveles de presión
Variables — arrays multidimensionales usando cero o más dimensiones:
float temperature(time, lev, lat, lon);
temperature:long_name = "Air Temperature";
temperature:units = "K";
temperature:_FillValue = -9999.f;
temperature:scale_factor = 0.001f;
temperature:add_offset = 250.f;
double time(time);
time:units = "hours since 1900-01-01 00:00:00.0";
time:calendar = "gregorian";
time:long_name = "Time";
Atributos globales — metadatos sobre el propio archivo:
:Conventions = "CF-1.9";
:history = "2024-03-15T00:00:00 ECMWF ERA5 reanalysis";
:institution = "Centro Europeo de Predicción del Tiempo a Plazo Medio";
:title = "ERA5 Temperatura 2023";
Versiones de NetCDF
| Versión | Notas |
|---|---|
| Classic (netCDF-3) | Formato original; limitado a 4 GB; todavía muy usado |
| 64-bit Offset | Elimina el límite de 4 GB; por lo demás idéntico a Classic |
| netCDF-4 | Basado en HDF5; admite grupos, compresión, chunking, múltiples dimensiones ilimitadas |
| netCDF-4 Modelo Clásico | Contenedor HDF5, pero restringido a las características del modelo clásico |
NetCDF-4 es la versión recomendada para nuevos archivos. Habilita compresión ZLIB (típicamente reducción de tamaño de 2 a 8 veces para datos climáticos en cuadrícula), chunking (optimizando el acceso por series temporales o cortes espaciales) y E/S paralela mediante HDF5+MPI.
Convenciones CF: El Estándar de Metadatos
Los archivos NetCDF por sí solos no especifican qué significa "latitud" o cómo interpretar los valores de tiempo. Las Convenciones CF (Climate and Forecast Metadata Conventions) llenan este vacío — un estándar mantenido por la comunidad que define:
- Nombres estándar para cantidades físicas (
air_temperature,sea_surface_temperature,precipitation_flux) - Requisitos de variables de coordenadas (cómo deben declararse lat/lon/tiempo/nivel)
- Métodos de celda para agregaciones estadísticas (
time: mean,time: maximum) - Atributos de mapeo de cuadrícula para proyecciones no geográficas (Lambert conforme, estereográfica polar)
- Variables auxiliares (indicadores de calidad, incertidumbres)
Un archivo NetCDF que declara Conventions = "CF-1.9" es interpretable por cualquier herramienta compatible con CF. El reanálisis ERA5 del ECMWF, las salidas de los modelos climáticos del CMIP6 y el modelo meteorológico GFS de la NOAA usan convenciones CF.
Lectura de NetCDF con Python
xarray es la interfaz moderna de alto nivel para NetCDF:
import xarray as xr
import numpy as np
# Abrir un archivo NetCDF (carga diferida — los datos no se leen hasta que se necesitan)
ds = xr.open_dataset("era5_temperatura_2023.nc")
print(ds) # resumen de todas las variables
print(ds.dims) # {'time': 8760, 'level': 37, 'lat': 721, 'lon': 1440}
print(ds['temperature'].attrs) # metadatos: unidades, long_name, etc.
# Seleccionar datos: temperatura a 850 hPa el 15 de enero de 2023
t850 = ds['temperature'].sel(
level=850,
time="2023-01-15T12:00",
method="nearest"
)
print(f"Media global a 850 hPa: {float(t850.mean()):.2f} K")
# Media temporal durante todo el año
media_anual = ds['temperature'].sel(level=850).mean(dim='time')
# Escribir en un nuevo archivo NetCDF
media_anual.to_netcdf("era5_t850_media_anual_2023.nc")
# Abrir múltiples archivos como un único dataset (concatenando a lo largo de 'time')
ds_todo = xr.open_mfdataset("era5_*.nc", combine="by_coords")
Herramientas de Línea de Comandos
ncdump — inspeccionar la estructura NetCDF:
ncdump -h era5.nc # solo cabecera (metadatos)
ncdump -v temperature era5.nc # volcar la variable de temperatura como ASCII
CDO (Climate Data Operators) — conjunto de herramientas de línea de comandos del ECMWF:
# Calcular la media anual
cdo yearmean era5_temperatura_2023.nc media_anual.nc
# Extraer una variable de un archivo multivariable
cdo select,name=temperature multi_var.nc solo_temperatura.nc
# Reproyectar de 0,25° a 1° usando interpolación bilineal
cdo remapbil,r360x181 era5_0p25.nc era5_1grado.nc
# Convertir de GRIB2 a NetCDF
cdo -f nc copy prevision_ecmwf.grib2 prevision.nc
# Serie temporal en una ubicación específica (Madrid: lat=40.4, lon=-3.7)
cdo remapnn,lon=-3.7/lat=40.4 era5.nc madrid_serie_temporal.nc
NCO (NetCDF Operators):
ncrcat archivo1.nc archivo2.nc combinado.nc # concatenar a lo largo de la dimensión de registro
ncks -v temperature archivo.nc salida.nc # extraer una variable
ncatted -a units,temperature,o,c,"degC" archivo.nc # editar atributo
Principales Conjuntos de Datos que Usan NetCDF
- ERA5 (ECMWF): más de 80 años de reanálisis global horario a resolución de 0,25° (~5 km); 0,5 PB en total; gratuito a través del Copernicus Climate Data Store
- CMIP6: salidas de ~50 modelos climáticos globales del 6.º Proyecto de Intercomparación de Modelos Acoplados; usado en el IPCC AR6
- GFS de la NOAA: salidas del modelo meteorológico operativo de Pronóstico Global; disponibles como GRIB2 y NetCDF
- Flotadores ARGO: ~4.000 flotadores de perfilado que proporcionan temperatura/salinidad oceánica hasta 2.000 m de profundidad; distribuidos como archivos NetCDF de perfil individual
- NASA MODIS/VIIRS: temperatura superficial terrestre, índices de vegetación y propiedades nubosas distribuidos como NetCDF (productos de Nivel 3)
- HYCOM: modelo oceánico de coordenadas híbridas — estado oceánico global 3D (temperatura, salinidad, velocidad) a resolución de 1/12°
NetCDF vs GRIB2
| Característica | NetCDF-4 | GRIB2 |
|---|---|---|
| Legibilidad | Estructura legible (ncdump) | Binario, requiere eccodes/cfgrib |
| Compresión | ZLIB vía HDF5 | JPEG2000 o PNG en sección de datos |
| Uso dominante | Modelos climáticos, archivos de reanálisis | Predicciones NWP operativas |
| Biblioteca Python | xarray, netCDF4 | cfgrib, eccodes-python |
| Autodescriptivo | Sí | Parcialmente (la edición 2 mejoró esto) |
| Dimensiones ilimitadas | Sí (netCDF-4) | No existe el concepto |
Conversiones relacionadas
Conversiones frecuentes del catálogo: