
Introducción a Xarray¶
Xarray es una librería de Python diseñada para facilitar el análisis y manipulación de datos multidimensionales etiquetados (como los que provienen de modelos climáticos, observaciones satelitales o simulaciones numéricas).
Inspirado en la estructura de Pandas, Xarray extiende su funcionalidad a arreglos N-dimensionales, permitiendo trabajar de forma intuitiva con datos que tienen múltiples coordenadas como tiempo, latitud y longitud.
Xarray es especialmente popular en ciencias de la Tierra y del clima, donde los datos suelen venir en formatos como NetCDF, Zarr o GRIB.
📚 Descripción general¶
Al completar este cuadernillo serás capaz de:
Comprender qué son
DataArrayyDatasetCrear objetos Xarray desde arreglos de NumPy
Asignar dimensiones y coordenadas
Explorar y seleccionar datos usando coordenadas
Calcular estadísticas y aplicar operaciones
Visualizar datos con
.plot()Leer datos reales desde archivos NetCDF
✅ Requisitos previos¶
| Concepto | Importancia | Notas |
|---|---|---|
| Introducción a NumPy | Necesario | Arreglos multidimensionales |
| Fundamentos de Pandas | Necesario | Indexado y manipulación tabular |
| Uso de JupyterLab | Útil | Navegación entre celdas |
⏱️ Tiempo estimado de aprendizaje:
Lectura y ejecución: 30-40 minutos
Con actividades de práctica: 60-90 minutos
✍️ Formato: interactivo, ejecuta y modifica el código a medida que avanzas
1. Primeros pasos con Xarray 🧪¶
La unidad básica en Xarray es el DataArray, que extiende la funcionalidad de los ndarray de NumPy. A diferencia de NumPy, Xarray permite asignar:- Dimensiones con nombre (time, lat, lon, etc.)- Coordenadas con etiquetas asociadas- Atributos descriptivos como unidades, nombre estándar, etc.Esta herramienta es particularmente poderosa cuando se trabaja con datos atmosféricos, oceanográficos o climáticos provenientes de modelos numéricos o sensores remotos, donde las variables dependen del tiempo, la latitud, la longitud y a veces también de la altitud.Importemos las librerías necesarias para este cuadernillo
Importar librerías¶
import xarray as xr
import numpy as np
import pandas as pd🎛️ 1.1. Crear un DataArray desde NumPy¶
Para comenzar, creamos una matriz tridimensional con valores simulados de temperatura (en grados Kelvin). Esta matriz tendrá dimensiones que representan el tiempo, la latitud y la longitud:
data = 283 + 5 * np.random.randn(5, 3, 4) # 5 tiempos, 3 latitudes, 4 longitudes
data.shape(5, 3, 4)Podemos construir un DataArray inicial directamente desde este arreglo de NumPy, aunque sin información adicional aún:
temp = xr.DataArray(data)
temp⚠️ Como no definimos nombres para las dimensiones, Xarray usa nombres genéricos como dim_0, dim_1, dim_2, lo cual puede dificultar la interpretación de los datos.
1.2 Asignar nombres de dimensiones 📀¶
Para mejorar la legibilidad, asignamos nombres explícitos a las dimensiones. Esto convierte un arreglo anónimo en un conjunto de datos más descriptivo y navegable:
temp = xr.DataArray(data, dims=["time", "lat", "lon"])
tempCreamos un objeto con datos y dimensiones que gráficamente se podría representar de la siguiente manera:

Esto nos permite realizar operaciones sobre dimensiones por nombre, en lugar de índices numéricos.
1.3 Agregar coordenadas a las dimensiones 🗺️¶
Además de los nombres, podemos asociar coordenadas reales que representen valores geográficos o temporales. Esto permite, por ejemplo, ubicar espacialmente los datos o hacer filtrados temporales:
times = pd.date_range("2018-01-01", periods=5)
lats = np.linspace(25, 55, 3)
lons = np.linspace(-120, -90, 4)Construimos nuevamente el DataArray, esta vez incluyendo coordenadas:
temp = xr.DataArray(data, coords=[times, lats, lons], dims=["time", "lat", "lon"])
tempCon esto obtenemos un objeto con visualización enriquecida: las dimensiones están etiquetadas y cada punto tiene una referencia espacial y temporal clara.

1.4 Agregar atributos descriptivos 🏷️¶
Finalmente, Xarray permite incluir metadatos como unidades físicas, nombres estándar de variables o descripciones adicionales. Esto es importante para la trazabilidad y para facilitar el trabajo colaborativo o la publicación de datos:
temp.attrs["units"] = "K"
temp.attrs["standard_name"] = "air_temperature"Estos atributos no alteran los datos, pero se usan al exportar, graficar o convertir los objetos a otros formatos como NetCDF. También ayudan a los usuarios a entender rápidamente qué representa el conjunto de datos.
2. Dataset: Contenedor multidimensional 🧳¶
Mientras que un DataArray representa una sola variable con sus dimensiones y coordenadas, un Dataset es un contenedor que puede almacenar múltiples DataArrays, que posiblemente compartan dimensiones y coordenadas.
Esto es muy útil en ciencias ambientales, donde queremos trabajar simultáneamente con variables como temperatura, presión, humedad, etc., dentro de un mismo archivo o conjunto de datos.
2.1 Crear múltiples DataArrays 🌡️¶
Partimos de los DataArrays que representan distintas variables físicas como temperatura del aire, presión atmosférica y humedad relativa:
# Temperatura
temp = xr.DataArray(
data=283 + 5 * np.random.randn(5, 3, 4),
coords={"time": times, "lat": lats, "lon": lons},
dims=["time", "lat", "lon"],
name="Temperature",
attrs={"units": "K", "standard_name": "air_temperature"}
)
# Presión
pressure = xr.DataArray(
data=1000 + 10 * np.random.randn(5, 3, 4),
coords={"time": times, "lat": lats, "lon": lons},
dims=["time", "lat", "lon"],
name="Pressure",
attrs={"units": "hPa", "standard_name": "air_pressure"}
)
# Humedad relativa
hr = xr.DataArray(
data=np.random.uniform(60, 100, size=5),
coords={"time": times},
dims=["time"],
name="RelativeHumidity",
attrs={"units": "%", "standard_name": "relative_humidity"}
)2.2 Crear el Dataset 📦¶
Una vez definidos los DataArrays, podemos crear un Dataset pasando un diccionario con las variables:
ds = xr.Dataset(
data_vars={
"Temperature": temp,
"Pressure": pressure,
"RelativeHumidity": hr
}
)En un entorno interactivo como JupyterLab, este Dataset se mostrará como un menú desplegable que incluye:- Dimensiones (dims)- Coordenadas (coords)- Variables (data_vars)- índices (indexes)- Atributos (attrs)
dsLa visualización del Dataset mostrará las dimensiones compartidas, las coordenadas y un resumen de cada variable contenida como se muestra en la siguiente imagen tomada de la documentación de xarray

Esto permite acceder rápidamente a las dimensiones comunes y explorar todas las variables de forma estructurada.
3. Selección de datos y operaciones básicas 🧩¶
Una vez que tenemos nuestros datos organizados en DataArray o Dataset, Xarray nos permite acceder, filtrar y operar sobre ellos de forma muy intuitiva utilizando etiquetas en lugar de índices numéricos.
3.1 Acceder a variables en un Dataset 🔎¶
Cada variable contenida dentro de un Dataset es un DataArray, y se puede acceder de manera sencilla usando notación por atributo ds.<atributo> (acceso directo si el nombre es válido)
ds.TemperatureO Notación por clave de diccionario (más general y flexible)
ds["Pressure"]Ambas formas retornan el DataArray correspondiente. La primera es más compacta, útil en notebooks interactivos; la segunda es más robusta, especialmente si los nombres contienen espacios, guiones u otros caracteres especiales.
3.2 Seleccionar datos por coordenadas con .sel() 🧭¶
El método .sel() permite seleccionar subconjuntos de datos utilizando los valores de las coordenadas en lugar de los índices posicionales. Esto hace que el código sea más legible y expresivo.
Por ejemplo, podemos seleccionar todos los datos para una fecha específica
ds.sel(time="2018-01-01")O seleccionar una variable y una ubicación específica
ds.Temperature.sel(time="2018-01-01", lat=25, lon=-120)✅ Muy útil y conveniente cuando trabajamos con fechas o ubicaciones reales.
3.3 Seleccionar datos por posición con .isel() 🔹¶
Si en cambio queremos seleccionar por posición (como con NumPy), usamos .isel(). Esto es útil cuando no conocemos las coordenadas exactas o estamos en procesos de automatización.
# Seleccionar el primer tiempo (posición 0)
ds.isel(time=0)Seleccionar temperatura para la primera posición de latitud y segunda longitud a lo largo del tiempo
ds.Temperature.isel(lat=0, lon=1)🧠 .isel() usa números de posición; .sel() usa etiquetas de coordenadas.
3.4 Seleccionar rangos con slice() 🪄¶
Podemos seleccionar rangos utilizando slice(), lo que facilita el trabajo con subconjuntos:
Por ejemplo seleccionemos el subconjunto de datos entre dos fechas
ds.sel(time=slice("2018-01-01", "2018-01-03"))O subconjunto de latitudes
ds.sel(lat=slice(30, 50))Esto es especialmente útil en análisis temporales o espaciales que requieren ventanas móviles.
4. Operaciones estadísticas y gráficas 📊¶
Una de las grandes ventajas de Xarray es que permite aplicar operaciones estadísticas y crear visualizaciones de forma muy similar a Pandas, pero extendidas a múltiples dimensiones.
4.1 Estadísticas sobre dimensiones 📐¶
Podemos calcular estadísticas como la media, desviación estándar, máximo o mínimo a lo largo de una o varias dimensiones.
# Media de temperatura a lo largo del tiempo
ds.Temperature.mean(dim="time")# Mínimo de presión sobre latitudes
ds.Pressure.min(dim="lat")# Desviación estándar de humedad relativa
ds.RelativeHumidity.std(dim="time")✅ Estas funciones son muy útiles para obtener resúmenes climatológicos o patrones promedios.
4.2 Interpolación de datos 🌐
Cuando necesitas obtener valores en coordenadas que no existen exactamente en tus datos, puedes usar .interp() para interpolar:
# Interpolación espacial
valor_interp = ds.Temperature.interp(lat=33.5, lon=-110)
valor_interp📌 Puedes especificar el método de interpolación (como linear, nearest) y ajustar la tolerancia.
4.3 Visualizaciones rápidas con .plot() 🖼️¶
Xarray incluye integración con Matplotlib para hacer gráficos rápidos desde cualquier DataArray:
Generemos una serie temporal de temperatura en una ubicación determinada
serie = ds.Temperature.sel(lat=40, lon=-100, method="nearest")
serie.plot()
O un mapa de temperatura para t=0
mapa = ds.Temperature.isel(time=0)
mapa.plot()
O un Mapa de temperatura promedio
prom_mapa = ds.Temperature.mean("time")
prom_mapa.plot()
🔍 Estas funciones detectan automáticamente si el resultado es 1D o 2D y generan una línea o un mapa respectivamente.
4.4 Aplicar máscaras y condiciones 🎭¶
Puedes aplicar filtros condicionales a los datos usando .where(), muy útil para enmascarar regiones o aplicar umbrales:
# Mostrar datos para latitudes menores a 50 grados
ds.Temperature.where(ds.lat < 50).isel(time=0).plot()
# Filtrar valores de presión mayores a cierto umbral
ds.Pressure.where(ds.Pressure > 1000).isel(time=1).plot()
🧪 .where() mantiene la forma del arreglo pero oculta los datos que no cumplen la condición.
4.5 Agrupación temporal con groupby() 📅¶
Xarray permite agrupar datos por coordenadas temporales para crear climatologías o calcular promedios estacionales usando .groupby():
# Crear datos con más tiempos para demostrar groupby
times_extended = pd.date_range('2018-01-01', periods=12, freq='M')
temp_extended = xr.DataArray(
data=283 + 5 * np.random.randn(12, 3, 4),
coords={'time': times_extended, 'lat': lats, 'lon': lons},
dims=['time', 'lat', 'lon']
)
# Agrupar por mes y calcular la media
temp_por_mes = temp_extended.groupby('time.month').mean()
temp_por_mesEste método es especialmente útil para calcular climatologías mensuales o estacionales a partir de series temporales largas.
📊 Puedes agrupar por: time.month, time.season, time.year, time.dayofyear, etc.
4.6 Operaciones aritméticas y broadcasting ➕¶
Xarray permite realizar operaciones aritméticas entre DataArrays, alineando automáticamente las coordenadas (broadcasting):
# Operación simple: sumar dos variables
temp_kelvin = ds.Temperature
temp_celsius = temp_kelvin - 273.15
print(f"Temperatura promedio: {temp_celsius.mean().values:.2f} °C")Temperatura promedio: 9.60 °C
# Combinar variables: calcular anomalía respecto a la media temporal
temp_mean = ds.Temperature.mean(dim='time')
temp_anomaly = ds.Temperature - temp_mean
temp_anomaly.isel(time=0)✨ Xarray alinea automáticamente las dimensiones, facilitando operaciones complejas sin necesidad de reindexar manualmente.
5. ✏️ Actividades de práctica¶
Ahora que has aprendido los conceptos fundamentales de Xarray, es momento de ponerlos en práctica. Estas actividades te ayudarán a consolidar lo aprendido usando el Dataset ds que creamos anteriormente (con variables de Temperatura, Presión y Humedad Relativa).
Ejercicio 1: Selección de datos¶
Objetivo: Practicar diferentes métodos de selección de datos.
Tarea: Usando el Dataset ds:
Selecciona la temperatura para la fecha ‘2018-01-03’ usando
.sel()Selecciona la presión para la tercera posición temporal usando
.isel()Extrae un rango de latitudes entre 30 y 50 grados
# Tu código aquíSolución
# 1. Temperatura para fecha específica
temp_dia3 = ds.Temperature.sel(time='2018-01-03')
print(temp_dia3)
# 2. Presión en tercera posición temporal
presion_t2 = ds.Pressure.isel(time=2)
print(presion_t2)
# 3. Rango de latitudes
datos_region = ds.sel(lat=slice(30, 50))
print(datos_region)Ejercicio 2: Operaciones estadísticas¶
Objetivo: Calcular estadísticas sobre diferentes dimensiones.
Tarea:
Calcula la temperatura promedio a lo largo del tiempo para cada ubicación espacial
Encuentra la presión máxima en cada punto temporal
Calcula la desviación estándar de la humedad relativa
# Tu código aquíSolución
# 1. Temperatura promedio en el tiempo
temp_promedio = ds.Temperature.mean(dim='time')
print(temp_promedio)
# 2. Presión máxima por tiempo
presion_max = ds.Pressure.max(dim=['lat', 'lon'])
print(presion_max)
# 3. Desviación estándar de humedad
hr_std = ds.RelativeHumidity.std()
print(f"Desviación estándar HR: {hr_std.values:.2f}%")Ejercicio 3: Aplicación de máscaras¶
Objetivo: Filtrar datos usando condiciones.
Tarea:
Crea una máscara que muestre solo temperaturas mayores a 285 K
Filtra la presión para mostrar solo valores menores a 995 hPa
Visualiza el resultado con
.plot()
# Tu código aquíSolución
# 1. Máscara de temperatura
temp_alta = ds.Temperature.where(ds.Temperature > 285)
print(temp_alta.isel(time=0))
# 2. Presión baja
presion_baja = ds.Pressure.where(ds.Pressure < 995)
print(presion_baja.isel(time=0))
# 3. Visualización
temp_alta.isel(time=0).plot()Ejercicio 4: Combinando operaciones¶
Objetivo: Integrar múltiples operaciones en un análisis completo.
Tarea:
Selecciona datos solo para las dos primeras fechas usando
slice()Calcula la temperatura promedio espacial (sobre lat y lon) para esas fechas
Grafica la serie temporal resultante
# Tu código aquíSolución
# 1 y 2. Selección y promedio espacial
temp_subset = ds.Temperature.sel(time=slice('2018-01-01', '2018-01-02'))
temp_promedio_espacial = temp_subset.mean(dim=['lat', 'lon'])
# 3. Visualización
temp_promedio_espacial.plot(marker='o')
import matplotlib.pyplot as plt
plt.title('Temperatura promedio espacial')
plt.ylabel('Temperatura (K)')
plt.grid(True)✅ Conclusiones¶
En este cuadernillo aprendiste los fundamentos del manejo de datos multidimensionales con Xarray, una herramienta esencial en la ciencia del clima, meteorología y disciplinas relacionadas con datos ambientales.
🔑 Lo más destacado:
Comprendiste la diferencia entre
DataArrayyDataset, dos estructuras clave para manejar datos con múltiples dimensiones y coordenadas.Aprendiste a etiquetar tus datos con dimensiones y coordenadas que hacen tu análisis más claro y reproducible.
Aplicaste operaciones estadísticas como
mean(),std()osum()a lo largo de diferentes dimensiones.Usaste
.sel()y.isel()para extraer datos fácilmente con etiquetas o índices.Generaste visualizaciones rápidas usando
.plot()para explorar tendencias temporales y mapas espaciales.
📦 Con este conocimiento ya puedes comenzar a trabajar con grandes volúmenes de datos científicos como modelos climáticos, observaciones satelitales o reanálisis atmosféricos.
📚 Recursos recomendados¶
🎓 ¡Felicitaciones! Estás listo para abordar análisis más complejos con datos multidimensionales usando Xarray.
Fuentes y Referencias¶
Rose, B. E. J., Kent, J., Tyle, K., Clyne, J., Banihirwe, A., Camron, D., May, R., Grover, M., Ford, R. R., Paul, K., Morley, J., Eroglu, O., Kailyn, L., & Zacharias, A. (2023). Pythia Foundations (Version v2023.05.01) Rose et al. (2023)
- Rose, B., Kent, J., Tyle, K., Clyne, Banihirwe, A., Camron, D., Ford, R., Morley, J., Grover, M., Eroglu, O., Paul, K., May, R., Lkailynncar, Irving, D., Uieda, L., Ojaybee, Blain, P., & Moon, Z. (2023). ProjectPythia/pythia-foundations: v2023.05.01. Zenodo. 10.5281/ZENODO.7884572