Skip to article frontmatterSkip to article content

Acceso a datos ERA5 en la nube


Introducción

En este cuaderno aprenderás a acceder y analizar datos del reanálisis atmosférico ERA5 utilizando ArrayLake, un servicio de repositorios Zarr en la nube que proporciona acceso eficiente a conjuntos de datos masivos.

ERA5 es la quinta generación de reanálisis producida por el ECMWF (Centro Europeo de Predicción Meteorológica a Mediano Plazo), que combina observaciones históricas con modelos numéricos para reconstruir el estado de la atmósfera desde 1950 hasta el presente. Este conjunto de datos es fundamental para estudios climáticos, análisis de eventos meteorológicos extremos, y validación de modelos.

Los datos que utilizaremos provienen del repositorio earthmover-public/era5-surface-aws en ArrayLake, que contiene 18 variables de superficie para el período 1975-2024 (~30 TB) en formato Zarr v3 / Icechunk. Esta estructura permite acceso eficiente mediante dos estrategias de chunking optimizadas: una para análisis espaciales (mapas) y otra para series temporales.

📚 Descripción general

En este cuaderno aprenderás a:

  1. Comprender qué es ERA5 y su importancia en estudios climáticos

  2. Diferenciar entre grupos spatial y temporal optimizados para diferentes consultas

  3. Acceder a datos ERA5 en formato Zarr v3 / Icechunk mediante ArrayLake

  4. Realizar análisis espaciales eficientes (mapas globales y regionales)

  5. Extraer y visualizar series temporales largas para ubicaciones específicas

✅ Requisitos previos

ConceptosImportanciaNotas
Introducción a XarrayNecesarioManipulación de arreglos multidimensionales etiquetados
Xarray: AgregaciónNecesarioOperaciones de agregación temporal y espacial
Xarray: Lectura de datosNecesarioApertura de conjuntos de datos NetCDF/Zarr
Fundamentos de PythonNecesarioVariables, funciones, estructuras de control
NumpyÚtilOperaciones con arreglos numéricos
Acceso a datos en la nubeÚtilComprensión de formatos cloud-nativos (Zarr, Icechunk)
Conocimientos de meteorologíaÚtilInterpretación de variables atmosféricas (temperatura, presión, viento)

⏱️ Tiempo estimado de aprendizaje: 30 minutos
✍️ Formato: Interactivo. Ejecuta y modifica el código en cada celda.


Librerías

Importamos las bibliotecas necesarias para trabajar con ArrayLake y visualizar datos.

from arraylake import Client
import xarray as xr
import matplotlib.pyplot as plt

Autenticación con ArrayLake

ArrayLake es un servicio de repositorios Zarr en la nube que proporciona acceso eficiente a grandes datasets como ERA5. Para usar ArrayLake:

  1. En Binder/JupyterHub: Ejecuta client.login() y sigue las instrucciones para autenticarte

  2. En GitHub Actions: Las credenciales se gestionan mediante secrets del repositorio

client = Client()
client.login()  # Solo necesario la primera vez por sesión
Loading...
repo = client.get_repo("earthmover-public/era5-surface-aws")

# Establecer vista de solo lectura del branch "main" inmutable
session = repo.readonly_session("main")

Ventajas del versionado:

  • 📜 Trazabilidad completa de cambios en los datos

  • 🔄 Posibilidad de revertir a versiones anteriores

  • 🌳 Branching para experimentos paralelos

  • 🔒 Reproducibilidad científica garantizada

Para este cuaderno, trabajamos con el snapshot inmutable de la rama main.

1. 🌍 Introducción a ERA5

ERA5 es la quinta generación de reanálisis atmosférico producida por el Centro Europeo de Predicción Meteorológica a Mediano Plazo (ECMWF). Este conjunto de datos combina observaciones históricas con modelos numéricos para generar una reconstrucción coherente del estado de la atmósfera en el pasado reciente.

Los reanálisis son fundamentales para estudios climáticos, ya que proporcionan información espacial y temporalmente continua, incluso en regiones donde las observaciones directas son escasas.

1.1. 📌 ¿Qué es un Reanálisis?

Un reanálisis es una reconstrucción científica del clima pasado basada en:

  • 🌐 Observaciones históricas:

    • Estaciones de superficie

    • Globos meteorológicos

    • Satélites

    • Buques, boyas y aviones

  • 🧠 Modelos numéricos:

    • Ecuaciones físicas modernas de la atmósfera

    • Técnicas de asimilación de datos

    • Poder computacional avanzado

1.2. 📎 Características clave de ERA5

  • ✅ Cobertura global: datos para toda la Tierra

  • ⏱️ Periodo temporal: desde 1950 hasta el presente (con datos horarios desde 1979)

  • 🌐 Resolución espacial: 0.25° (~31 km)

  • 📈 Más de 240 variables disponibles (temperatura, viento, precipitación, etc.)

  • ⚙️ Datos consistentes gracias a la asimilación de observaciones

💡 Nota: En este cuaderno trabajaremos directamente con los datos de ERA5 almacenados en formato Zarr en Google Cloud, lo que permite explorar grandes volúmenes de información sin necesidad de descargarlos completamente.

2. ☁️ Acceso a datos ERA5 con ArrayLake

El conjunto de datos ERA5 está disponible a través de ArrayLake en el repositorio earthmover-public/era5-surface-aws. Esta versión curada contiene:

  • 18 variables de superficie (temperatura 2m, viento 10m, presión, nubosidad, etc.)

  • 📅 Periodo: 1975-01-01 a 2024-12-31 (50 años de datos horarios)

  • 🌐 Resolución espacial: 0.25° (~31 km)

  • ⏱️ Resolución temporal: Horaria

  • 💾 Tamaño total: ~30 TB en formato Zarr v3 / Icechunk

Grupos de datos

El repositorio ofrece dos grupos con diferentes estrategias de chunking:

  1. spatial: Optimizado para consultas espaciales (mapas globales)

    • Chunks: (time=1, latitude=721, longitude=1440)

    • Ideal para: Visualizar campos instantáneos, análisis de patrones espaciales

  2. temporal: Optimizado para series temporales y ML

    • Chunks: (time=8736, latitude=12, longitude=12) → 1 año de datos horarios

    • Ideal para: Series temporales, entrenamiento de modelos ML/IA

3. 🗺️ Grupo Spatial - Análisis espacial

Comenzamos trabajando con el grupo spatial, optimizado para consultas de mapas y análisis espaciales.

Este grupo usa chunks (time=1, latitude=721, longitude=1440) que cargan un mapa completo por cada paso temporal.

3.1. 🔓 Apertura del grupo spatial

%%time
ds_spatial = xr.open_dataset(
    session.store,
    engine="zarr",
    consolidated=False,
    zarr_format=3,
    chunks={},
    group="spatial"  # Grupo optimizado para consultas espaciales
)

El conjunto de datos se ha abierto correctamente utilizando acceso anónimo y carga perezosa (lazy loading) gracias al formato zarr

display(ds_spatial)

3.2. 📋 Contenido del conjunto de datos

El conjunto de datos contiene:

  • 18 variables de superficie horarias (e.g., t2, d2, u10, v10, sp, cape)

  • 📐 Dimensiones: time (438,312) × latitude (721) × longitude (1,440)

  • 🌍 Coordenadas: latitudes −90° → 90°, longitudes 0° → 360°

  • 💾 Tamaño total: ~30 TB almacenados en formato Zarr v3 / Icechunk

  • 📝 Metadatos globales: CF-1.6, fuente de datos, historial

3.3. 💾 Tamaño del conjunto de datos

Una vez abierto el conjunto de datos, es útil calcular su tamaño total estimado en memoria. Esto nos ayuda a dimensionar los recursos necesarios para su análisis.

# Tamaño total del dataset en TB (terabytes)
size_tb = ds_spatial.nbytes / 1024**4
print(f"Dataset size: {size_tb:.1f} TB")

3.4. 🌍 Visualización: Mapa global

Visualicemos la temperatura global en un instante específico. Gracias al chunking espacial, cargar un mapa completo es muy eficiente.

# Extraer la variable de temperatura a 2 metros
t2m = ds_spatial.t2
import matplotlib.pyplot as plt

# Seleccionar un instante específico
instant = "2018-01-01 12:00"
fig, ax = plt.subplots(figsize=(10, 4))

# Graficar temperatura en Kelvin
t2m.sel(time=instant).plot(ax=ax, cmap="coolwarm", robust=True)

# Embellecer la figura
ax.set_title(f"Temperatura a 2 metros (t2) - {instant}", fontsize=14)
ax.set_xlabel("Longitud [°E]", fontsize=12)
ax.set_ylabel("Latitud [°N]", fontsize=12)
ax.tick_params(labelsize=10)

plt.tight_layout()
plt.savefig("../images/era-temp2.png", dpi=150, bbox_inches="tight")
plt.show()

3.5. 🇨🇴 Subsetting espacial: Colombia

Ahora aprendamos a seleccionar una subregión espacial. Vamos a extraer datos solo para Colombia y visualizar la temperatura promedio para un día específico.

En ERA5, las longitudes van de 0° a 360° (en lugar de -180° a 180°). Para Colombia usamos:

  • Longitud: 275° a 300° (equivalente a -85° a -60°)

  • Latitud: 14° a -3°

# Seleccionar región de Colombia usando el grupo spatial
t2_colombia = ds_spatial.t2.sel(
    longitude=slice(275, 300),  # -85° a -60°
    latitude=slice(14, -3),     # Norte a sur
    time="2024-06-14"           # Un día específico
)

# Convertir a Celsius y promediar el día
t2_colombia_mean = (t2_colombia - 273.15).mean(dim="time")

print(f"Shape: {t2_colombia_mean.shape}")  # (69, 101) - región de Colombia
# Visualizar temperatura promedio diaria sobre Colombia
fig, ax = plt.subplots(figsize=(8, 5))
t2_colombia_mean.plot.contourf(
    ax=ax,
    cmap="RdYlBu_r",
    levels=15,
    cbar_kwargs={"label": "Temperatura (°C)"}
)
ax.set_title("Temperatura promedio - Colombia (14 junio 2024)", fontsize=14)
ax.set_xlabel("Longitud (°E)")
ax.set_ylabel("Latitud (°N)")
plt.tight_layout()
plt.show()

✏️ Ejercicio 1: Practica subsetting espacial

Objetivo: Aplicar lo aprendido sobre selección espacial con el grupo spatial.

Tareas:

  1. Extrae un mapa de presión superficial (sp) para 15 de agosto de 2024 a las 12:00 UTC

  2. Selecciona la región de la Amazonía (lon=[280:300], lat=[5:-10]) para 1 de enero de 2024

  3. Calcula y visualiza la temperatura promedio de ese día sobre la Amazonía

# Tu código aquí

4. ⏱️ Grupo Temporal - Series de tiempo

Ahora trabajamos con el grupo temporal, optimizado para series temporales largas.

Este grupo usa chunks (time=8736, latitude=12, longitude=12) que cargan 1 año completo de datos para ubicaciones pequeñas.

4.1. 🔓 Apertura del grupo temporal

%%time
ds_temporal = xr.open_dataset(
    session.store,
    engine="zarr",
    consolidated=False,
    zarr_format=3,
    chunks={},
    group="temporal"  # Grupo optimizado para series temporales
)

4.2. 📈 Serie temporal para Bogotá

Extraigamos una serie temporal completa para Bogotá usando el grupo temporal. Este tipo de consulta (“churro”) es exactamente para lo que este grupo fue optimizado.

Extracción de serie temporal para Bogotá

Bogotá está ubicada aproximadamente en:

  • Latitud: 4.7° N

  • Longitud: 285.9° E (equivalente a -74.1° W)

Extraigamos la temperatura para todo el año 2024:

# Extraer serie temporal para Bogotá usando el grupo temporal
t2_bogota_2024 = ds_temporal.t2.sel(
    time=slice("2024-01-01", "2024-12-31")).sel(
    latitude=4.7,
    longitude=285.9,
    method='nearest'  # Encuentra el punto más cercano
)

# Convertir a Celsius
t2_bogota_celsius = t2_bogota_2024 - 273.15

print(f"Shape: {t2_bogota_celsius.shape}")  # (8784,) = 366 días × 24 horas (2024 es bisiesto)
print(f"Temperatura promedio 2024: {t2_bogota_celsius.mean().values:.2f} °C")

Visualización de la serie temporal

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(12, 4))

# Graficar serie completa
t2_bogota_celsius.plot(ax=ax, linewidth=0.5, color="steelblue")

ax.set_title("Temperatura en Bogotá - 2024 (datos horarios)", fontsize=14)
ax.set_xlabel("Fecha")
ax.set_ylabel("Temperatura (°C)")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Cálculo de climatología mensual

Podemos calcular promedios mensuales usando .groupby():

# Climatología mensual para Bogotá
t2_bogota_monthly = t2_bogota_celsius.groupby("time.month").mean()

# Visualizar
fig, ax = plt.subplots(figsize=(10, 5))
t2_bogota_monthly.plot(ax=ax, marker="o", linewidth=2, markersize=8)
ax.set_title("Climatología mensual - Bogotá 2024", fontsize=14)
ax.set_xlabel("Mes")
ax.set_ylabel("Temperatura promedio (°C)")
ax.set_xticks(range(1, 13))
ax.set_xticklabels(["Ene", "Feb", "Mar", "Abr", "May", "Jun", 
                    "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"])
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

✏️ Ejercicio 2: Practica series temporales

Objetivo: Extraer y analizar series temporales con el grupo temporal.

Tareas:

  1. Extrae la serie de viento zonal (u10) para Medellín (lat=6.25, lon=284.5) durante enero 2024

  2. Calcula el viento promedio y grafícalo

  3. Compara la temperatura de Bogotá vs Barranquilla (lat=11.0, lon=285.2) para la primera semana de enero 2024

# Tu código aquí

5. ¿Qué sigue?

Ahora que sabes cómo acceder a datos ERA5 en formato Zarr, puedes explorar:

Proyecto sugerido

Desarrolla un análisis de tendencias climáticas para Colombia:

  1. Extrae temperatura mensual para Colombia desde 1979 hasta el presente

  2. Calcula la tendencia lineal y estadísticas de cambio

  3. Visualiza la serie temporal con anomalías respecto a la climatología 1991-2020

  4. Compara con datos de estaciones del IDEAM para validación

Este proyecto te introducirá al análisis de variabilidad y cambio climático regional usando reanálisis.

6. ✅ Conclusiones

En este cuadernillo aprendimos a acceder y explorar el conjunto de datos de reanálisis ERA5 a través de ArrayLake, utilizando el repositorio earthmover-public/era5-surface-aws. Algunos puntos clave:

✔️ Comprendimos qué es un reanálisis y por qué ERA5 es fundamental para estudios climáticos ✔️ Accedimos al dataset (18 variables, 30 TB, 1975-2024) sin descarga local usando ArrayLake ✔️ Exploramos dos grupos optimizados: spatial (mapas) y temporal (series de tiempo) ✔️ Realizamos selección espacial sobre Colombia y visualizamos campos de temperatura ✔️ Aplicamos principios de lazy loading y data streaming con Zarr v3 / Icechunk ✔️ Comprendimos la importancia del chunking para optimizar diferentes tipos de consultas

📚 Recursos y referencias


7. ✏️ Ejercicios adicionales

Ahora que has practicado análisis espacial y series temporales, aquí tienes ejercicios adicionales para profundizar tus habilidades.

# Tu código aquí

Ejercicio 4: Selección espacial con grupo spatial

Objetivo: Practicar subsetting espacial eficiente para análisis de mapas.

Tarea: Usando el grupo spatial (optimizado para consultas espaciales):

  1. Extrae un mapa de presión superficial (sp) para el 15 de agosto de 2024 a las 12:00 UTC

  2. Selecciona la región de Colombia (lon=[275:300], lat=[14:-3]) para todo el mes de junio 2024

  3. Calcula la temperatura promedio para la Amazonía (lon=[280:300], lat=[-10:5]) el 1 de enero de 2024

# Tu código aquí

Ejercicio 5: Cálculos estadísticos

Objetivo: Aplicar operaciones estadísticas sobre dimensiones específicas.

Tarea:

  1. Calcula la temperatura promedio global para el año 2020

  2. Encuentra la presión superficial (sp) máxima y mínima para Colombia (lat=[14:-3], lon=[275:300]) durante 2024

  3. Calcula la climatología mensual de temperatura (promedio por mes) para el período 2015-2024

# Tu código aquí

Ejercicio 6: Series temporales con grupo temporal

Objetivo: Extraer series temporales largas para ubicaciones específicas (churros).

Tarea: Usando el grupo temporal (optimizado para series de tiempo):

  1. Extrae la serie temporal de viento zonal (u10) para Medellín (lat=6.25, lon=284.5) durante 2023-2024

  2. Calcula la velocidad promedio del viento para Cali (lat=3.4, lon=283.5) por mes en 2024

  3. Compara las series de temperatura para 3 ciudades: Bogotá (4.7, 285.9), Barranquilla (11, 285.2), Pasto (1.2, 282.9) en enero 2024

  4. Identifica el día más cálido del año 2024 en Cartagena (lat=10.4, lon=284.5)

# Tu código aquí