{ "cells": [ { "cell_type": "markdown", "id": "e4319f9a", "metadata": {}, "source": [ "# Librería Xarray" ] }, { "cell_type": "markdown", "id": "03419cd2", "metadata": {}, "source": [ "Pandas es una librería muy útil para tratar datos tabulados, en dos dimensiones, pero no es tan conveniente para tres dimensiones o más. Sin embargo en meteorología es muy habitual tratar con datos multidimensionales, por ejemplo en campos meteorológicos que dependen de las tres coordenadas espaciales y del tiempo.\n", "\n", "Xarray (https://docs.xarray.dev) es una librería construida sobre Numpy que permite tratar datos multidimensionales con etiquetas, y comparte muchas de las características de Pandas. Hace que los datos sean más legibles tratándolos de forma sencilla y eficiente.\n", "\n", "Además está estrechamente relacionado con Cartopy, otra librería especializada en el dibujo de mapas." ] }, { "cell_type": "markdown", "id": "209e9bc3", "metadata": {}, "source": [ "## Lectura de datos. Estructuras Dataset y DataArray" ] }, { "cell_type": "markdown", "id": "cbfd4b49", "metadata": {}, "source": [ "Cargamos el módulo xarray:" ] }, { "cell_type": "code", "execution_count": 1, "id": "cb2d795d", "metadata": {}, "outputs": [], "source": [ "import xarray as xr\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "fd8b4877", "metadata": {}, "outputs": [], "source": [ "# Deshabilitamos los avisos\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "id": "80e01c62", "metadata": {}, "source": [ "``open_dataset`` es una función de xarray que nos permite abrir ficheros netCDF (o URLs de un servidor remoto OpenDAP). El formato netCDF se utiliza comúnmente en meteorología para guardar información de los modelos meteorológicos (junto al formato grib), y xarray está especialmente adaptado para leerlo." ] }, { "cell_type": "markdown", "id": "11f29a2c", "metadata": {}, "source": [ "Para ilustrar xarray vamos a utilizar aquí varios ficheros del reanálisis ERA5 (https://www.ecmwf.int/en/forecasts/dataset/ecmwf-reanalysis-v5), descargados del Climate Data Store del C3S (Climate Change Service) del programa Copernicus. Se puede encontrar más información en https://climate.copernicus.eu/climate-reanalysis." ] }, { "cell_type": "code", "execution_count": 3, "id": "1e216fd3", "metadata": {}, "outputs": [], "source": [ "ds = xr.open_dataset('/MASIVO/pn31/curso_PIBM/era5_america_2022.nc')" ] }, { "cell_type": "markdown", "id": "ebfe8cbe", "metadata": {}, "source": [ "``open_dataset`` abre un fichero netcDF y nos devuelve una de las dos estructuras básicas de datos de xarray, el Dataset. El Dataset es una especie de diccionario de DataArrays (otra estructura que veremos después):" ] }, { "cell_type": "markdown", "id": "b8d117f0", "metadata": {}, "source": [ "Si se quiere abrir varios ficheros netCDF simultáneamente y cargarlos en un único dataset (por ejemplo, si tenemos 24 ficheros netCDF, uno por hora de predicción) podemos usar la función ``open_mfdataset``. Para liberar los recursos usaremos ``close``." ] }, { "cell_type": "markdown", "id": "1a30c71b", "metadata": {}, "source": [ "**Nota:** Por otra parte, si se quieren abrir ficheros con formato grib con xarray es necesario instalar previamente la librería cfgrib y dar al argumento *engine* de ``open_dataset`` el valor 'cfgrib' para que abra el fichero correctamente." ] }, { "cell_type": "markdown", "id": "fe352672", "metadata": {}, "source": [ "Veamos que contiene esta estructura de datos:" ] }, { "cell_type": "code", "execution_count": 5, "id": "84f20168", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<xarray.Dataset>\n", "Dimensions: (longitude: 361, latitude: 373, time: 568)\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", " * time (time) datetime64[ns] 2022-01-05 ... 2022-12-30T21:00:00\n", "Data variables:\n", " t2m (time, latitude, longitude) float32 ...\n", " sst (time, latitude, longitude) float32 ...\n", "Attributes:\n", " Conventions: CF-1.6\n", " history: 2023-09-02 16:18:24 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
<xarray.DataArray 't2m' (time: 568, latitude: 373, longitude: 361)>\n", "[76482904 values with dtype=float32]\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", " * time (time) datetime64[ns] 2022-01-05 ... 2022-12-30T21:00:00\n", "Attributes:\n", " units: K\n", " long_name: 2 metre temperature
<xarray.DataArray 'latitude' (latitude: 373)>\n", "array([ 33. , 32.75, 32.5 , ..., -59.5 , -59.75, -60. ], dtype=float32)\n", "Coordinates:\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", "Attributes:\n", " units: degrees_north\n", " long_name: latitude
<xarray.DataArray 't2m' (latitude: 3, longitude: 5)>\n", "array([[10.477875, 13.117981, 16.6362 , 16.644379, 16.645538],\n", " [ 9.706024, 11.723785, 15.378601, 16.667725, 16.421356],\n", " [ 9.812286, 11.28241 , 14.028778, 15.884216, 16.778656]],\n", " dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -115.0 -114.8 -114.5 -114.2 -114.0\n", " * latitude (latitude) float32 30.5 30.25 30.0\n", " time datetime64[ns] 2022-01-05T03:00:00
<xarray.DataArray 't2m' (latitude: 373, longitude: 361)>\n", "array([[14.0486145 , 14.07782 , 14.214447 , ..., 19.525055 ,\n", " 19.540222 , 19.55774 ],\n", " [14.096497 , 14.203918 , 14.231964 , ..., 19.519196 ,\n", " 19.520355 , 19.528534 ],\n", " [14.115173 , 14.206268 , 14.217926 , ..., 19.532043 ,\n", " 19.532043 , 19.546051 ],\n", " ...,\n", " [ 2.4617615 , 2.509613 , 2.5656738 , ..., -0.1375122 ,\n", " -0.1375122 , -0.17486572],\n", " [ 2.3683472 , 2.4033813 , 2.438385 , ..., -0.2741089 ,\n", " -0.26593018, -0.2484436 ],\n", " [ 2.315796 , 2.3391418 , 2.3624878 , ..., -0.32315063,\n", " -0.31497192, -0.29748535]], dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", " time datetime64[ns] 2022-01-05T03:00:00
<xarray.DataArray 't2m' (latitude: 373, longitude: 361)>\n", "array([[14.0486145 , 14.07782 , 14.214447 , ..., 19.525055 ,\n", " 19.540222 , 19.55774 ],\n", " [14.096497 , 14.203918 , 14.231964 , ..., 19.519196 ,\n", " 19.520355 , 19.528534 ],\n", " [14.115173 , 14.206268 , 14.217926 , ..., 19.532043 ,\n", " 19.532043 , 19.546051 ],\n", " ...,\n", " [ 2.4617615 , 2.509613 , 2.5656738 , ..., -0.1375122 ,\n", " -0.1375122 , -0.17486572],\n", " [ 2.3683472 , 2.4033813 , 2.438385 , ..., -0.2741089 ,\n", " -0.26593018, -0.2484436 ],\n", " [ 2.315796 , 2.3391418 , 2.3624878 , ..., -0.32315063,\n", " -0.31497192, -0.29748535]], dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", " time datetime64[ns] 2022-01-05T03:00:00
<xarray.DataArray 't2m' (latitude: 41, longitude: 41)>\n", "array([[10.093689, 12.35434 , 13.831451, ..., 20.114716, 20.481354,\n", " 20.815338],\n", " [ 9.454987, 14.007751, 15.303894, ..., 20.15326 , 20.38797 ,\n", " 20.870209],\n", " [13.017578, 15.704407, 15.413635, ..., 20.62616 , 20.481354,\n", " 20.887726],\n", " ...,\n", " [22.17334 , 22.208374, 22.246887, ..., 26.030182, 26.108429,\n", " 26.122437],\n", " [22.300598, 22.092773, 22.095093, ..., 26.011505, 26.053528,\n", " 26.066376],\n", " [22.319305, 21.984161, 21.92694 , ..., 25.898224, 25.962463,\n", " 26.014984]], dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -90.0 -89.75 -89.5 ... -80.5 -80.25 -80.0\n", " * latitude (latitude) float32 30.0 29.75 29.5 29.25 ... 20.5 20.25 20.0\n", " time datetime64[ns] 2022-01-05T03:00:00
<xarray.DataArray 't2m' (longitude: 361)>\n", "array([20.08902 , 20.192963 , 20.27237 , 20.370453 , 20.421814 ,\n", " 20.526917 , 20.667023 , 20.817657 , 20.928589 , 21.011505 ,\n", " 21.050018 , 21.122437 , 21.151611 , 21.171478 , 21.149292 ,\n", " 21.174957 , 21.232178 , 21.294067 , 21.360626 , 21.40033 ,\n", " 21.473907 , 21.630371 , 21.805511 , 21.967834 , 22.034393 ,\n", " 22.11029 , 22.124298 , 22.126617 , 22.187347 , 22.23407 ,\n", " 22.295929 , 22.399872 , 22.513123 , 22.65207 , 22.76535 ,\n", " 22.864594 , 22.88446 , 22.803894 , 22.730316 , 22.798035 ,\n", " 22.963867 , 23.202057 , 23.36905 , 23.395905 , 23.346863 ,\n", " 23.311829 , 23.355011 , 23.462463 , 23.59906 , 23.697144 ,\n", " 23.770721 , 23.8396 , 23.933014 , 24.055634 , 24.150208 ,\n", " 24.229614 , 24.454987 , 24.272827 , 21.787994 , 20.105377 ,\n", " 18.759033 , 17.026215 , 15.417145 , 16.375824 , 17.503784 ,\n", " 17.356659 , 19.121033 , 19.929047 , 20.32608 , 19.249481 ,\n", " 17.870453 , 17.246887 , 16.63855 , 16.284729 , 17.237549 ,\n", " 20.724243 , 20.784973 , 19.223785 , 19.083649 , 17.185028 ,\n", " 15.887726 , 14.321869 , 12.622894 , 12.17099 , 11.770477 ,\n", " 10.309723 , 9.185242 , 9.823975 , 11.6093445, 14.341705 ,\n", " 16.360626 , 16.973663 , 18.294312 , 21.232178 , 23.372528 ,\n", " 23.509155 , 23.648102 , 23.649292 , 23.671478 , 23.745026 ,\n", "...\n", " 23.444946 , 23.345673 , 23.446106 , 23.583893 , 23.639954 ,\n", " 23.679626 , 23.674957 , 23.622437 , 23.53601 , 23.517334 ,\n", " 23.506836 , 23.505646 , 23.453125 , 23.47998 , 23.529022 ,\n", " 23.622437 , 23.738037 , 23.854797 , 23.912018 , 23.912018 ,\n", " 23.95639 , 23.938873 , 24.007751 , 24.07782 , 24.057983 ,\n", " 24.005432 , 23.888641 , 23.753204 , 23.65979 , 23.581543 ,\n", " 23.509155 , 23.488129 , 23.42743 , 23.474121 , 23.495148 ,\n", " 23.555878 , 23.637604 , 23.624756 , 23.509155 , 23.456604 ,\n", " 23.286133 , 23.154175 , 22.878601 , 22.6474 , 22.76886 ,\n", " 23.233582 , 23.639954 , 23.811584 , 23.8396 , 23.852448 ,\n", " 23.83377 , 23.84311 , 23.854797 , 23.888641 , 23.909668 ,\n", " 23.923676 , 23.880493 , 23.825592 , 23.811584 , 23.829102 ,\n", " 23.808075 , 23.72168 , 23.622437 , 23.512665 , 23.409912 ,\n", " 23.325836 , 23.216064 , 23.110992 , 23.087616 , 23.042084 ,\n", " 22.962677 , 22.901978 , 22.800385 , 22.751343 , 22.713959 ,\n", " 22.661438 , 22.626404 , 22.58786 , 22.565674 , 22.593689 ,\n", " 22.65207 , 22.742004 , 22.809723 , 22.843597 , 22.855255 ,\n", " 22.856415 , 22.806213 , 22.733826 , 22.603027 , 22.492126 ,\n", " 22.450073 , 22.420868 , 22.429047 , 22.452423 , 22.489777 ,\n", " 22.501465 ], dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " latitude float32 20.25\n", " time datetime64[ns] 2022-01-05T03:00:00
<xarray.Dataset>\n", "Dimensions: (longitude: 121, latitude: 121, level: 16, time: 40)\n", "Coordinates:\n", " * longitude (longitude) float32 -105.0 -104.8 -104.5 ... -75.5 -75.25 -75.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... 3.75 3.5 3.25 3.0\n", " * level (level) int32 500 550 600 650 700 750 ... 900 925 950 975 1000\n", " * time (time) datetime64[ns] 2010-09-14 ... 2010-09-18T21:00:00\n", "Data variables:\n", " t (time, level, latitude, longitude) float32 ...\n", "Attributes:\n", " Conventions: CF-1.6\n", " history: 2023-09-02 17:34:50 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
<xarray.Dataset>\n", "Dimensions: (longitude: 161, latitude: 121, time: 40)\n", "Coordinates:\n", " * longitude (longitude) float32 -105.0 -104.8 -104.5 ... -65.5 -65.25 -65.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... 3.75 3.5 3.25 3.0\n", " * time (time) datetime64[ns] 2010-09-14 ... 2010-09-18T21:00:00\n", "Data variables:\n", " t2m (time, latitude, longitude) float32 ...\n", " lsm (time, latitude, longitude) float32 ...\n", " msl (time, latitude, longitude) float32 ...\n", " tp (time, latitude, longitude) float32 ...\n", "Attributes:\n", " Conventions: CF-1.6\n", " history: 2023-09-02 17:49:00 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
<xarray.DataArray 't2m' ()>\n", "array(19.10648, dtype=float32)
<xarray.DataArray 't2m' (season: 4, latitude: 373, longitude: 361)>\n", "array([[[ 11.440033 , 11.445862 , 11.594177 , ..., 15.509399 ,\n", " 15.320221 , 15.277039 ],\n", " [ 11.320923 , 11.535797 , 11.724945 , ..., 15.605133 ,\n", " 15.483704 , 15.481384 ],\n", " [ 11.394501 , 11.570801 , 11.736633 , ..., 15.884216 ,\n", " 15.737091 , 15.731262 ],\n", " ...,\n", " [ 0.6810303 , 0.696228 , 0.7067261 , ..., -2.64917 ,\n", " -2.6340027 , -2.6503296 ],\n", " [ 0.5280762 , 0.5397644 , 0.553772 , ..., -2.70755 ,\n", " -2.6923828 , -2.6678467 ],\n", " [ 0.27819824, 0.30038452, 0.31906128, ..., -2.7904663 ,\n", " -2.7822876 , -2.7414246 ]],\n", "\n", " [[ 13.284973 , 13.590912 , 13.822113 , ..., 19.894012 ,\n", " 19.875336 , 19.875336 ],\n", " [ 13.140167 , 13.282623 , 13.491638 , ..., 19.97342 ,\n", " 19.992126 , 19.989777 ],\n", " [ 13.224243 , 13.197388 , 13.284973 , ..., 20.121735 ,\n", " 20.115875 , 20.101868 ],\n", "...\n", " [ -0.37686157, -0.34768677, -0.31030273, ..., -5.8077393 ,\n", " -5.7353516 , -5.62677 ],\n", " [ -0.43292236, -0.41540527, -0.40371704, ..., -6.2059326 ,\n", " -6.141693 , -6.0751343 ],\n", " [ -0.48312378, -0.39089966, -0.30215454, ..., -6.551544 ,\n", " -6.5223694 , -6.4838257 ]],\n", "\n", " [[ 12.652069 , 12.903137 , 13.102814 , ..., 20.14273 ,\n", " 20.159088 , 20.08435 ],\n", " [ 12.64975 , 12.774689 , 12.94635 , ..., 20.259521 ,\n", " 20.259521 , 20.174255 ],\n", " [ 13.047913 , 13.071289 , 13.131989 , ..., 20.32257 ,\n", " 20.20697 , 20.134583 ],\n", " ...,\n", " [ -5.513489 , -5.4259033 , -5.341858 , ..., -9.577026 ,\n", " -9.61203 , -9.670441 ],\n", " [ -5.6641235 , -5.5730286 , -5.5263367 , ..., -10.111816 ,\n", " -10.143341 , -10.169037 ],\n", " [ -5.7832336 , -5.7411804 , -5.716675 , ..., -10.604584 ,\n", " -10.633759 , -10.645447 ]]], dtype=float32)\n", "Coordinates:\n", " * longitude (longitude) float32 -120.0 -119.8 -119.5 ... -30.5 -30.25 -30.0\n", " * latitude (latitude) float32 33.0 32.75 32.5 32.25 ... -59.5 -59.75 -60.0\n", " * season (season) object 'DJF' 'JJA' 'MAM' 'SON'