Skip to content

Instantly share code, notes, and snippets.

@rsignell
Created October 16, 2025 20:24
Show Gist options
  • Save rsignell/0d15a989eb5ea2a54fb8efbf3a70a879 to your computer and use it in GitHub Desktop.
Save rsignell/0d15a989eb5ea2a54fb8efbf3a70a879 to your computer and use it in GitHub Desktop.

Revisions

  1. rsignell created this gist Oct 16, 2025.
    805 changes: 805 additions & 0 deletions era5_evap.ipynb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,805 @@
    {
    "cells": [
    {
    "cell_type": "markdown",
    "id": "d9a0259d-b56b-429c-9a76-7316829b8b63",
    "metadata": {},
    "source": [
    "# ERA5 EVAP from AWS: Virtualizarr & Icechunk"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 1,
    "id": "096be375-3c98-429f-843e-b53f94049da6",
    "metadata": {},
    "outputs": [],
    "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\", category=UserWarning)"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 2,
    "id": "1de3bfc8-2eb4-440b-be3e-3f34cbc6389f",
    "metadata": {},
    "outputs": [],
    "source": [
    "data_bucket = \"s3://nsf-ncar-era5\""
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 3,
    "id": "e5478c68-745e-423c-ac1e-eedf997bc992",
    "metadata": {},
    "outputs": [],
    "source": [
    "import fsspec\n",
    "fs = fsspec.filesystem('s3', anon=True)"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 4,
    "id": "c652eea8-93ca-4791-9a1c-2a331f3091c1",
    "metadata": {},
    "outputs": [],
    "source": [
    "flist = fs.glob(f'{data_bucket}/e5.oper.fc.sfc.accumu/196001/*128_182_e*.nc')"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 5,
    "id": "08e66934-0405-4fa7-9a04-a6528c6d8577",
    "metadata": {},
    "outputs": [
    {
    "data": {
    "text/plain": [
    "['nsf-ncar-era5/e5.oper.fc.sfc.accumu/196001/e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1960010106_1960011606.nc',\n",
    " 'nsf-ncar-era5/e5.oper.fc.sfc.accumu/196001/e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1960011606_1960020106.nc']"
    ]
    },
    "execution_count": 5,
    "metadata": {},
    "output_type": "execute_result"
    }
    ],
    "source": [
    "flist"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 6,
    "id": "47383323-52d7-4ae5-bf31-cc74f547f79d",
    "metadata": {},
    "outputs": [],
    "source": [
    "flist = [f's3://{f}' for f in flist]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 7,
    "id": "fa06c4b3-7c50-4b65-b8bc-caca5522cb7f",
    "metadata": {},
    "outputs": [],
    "source": [
    "import xarray as xr\n",
    "from obstore.store import from_url\n",
    "\n",
    "from virtualizarr import open_virtual_dataset\n",
    "from virtualizarr.parsers import HDFParser\n",
    "from virtualizarr.registry import ObjectStoreRegistry"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 8,
    "id": "865edd39-32f4-4dcc-b556-44c0789d0846",
    "metadata": {},
    "outputs": [],
    "source": [
    "store = from_url(data_bucket, region=\"us-west-2\", skip_signature=True)\n",
    "registry = ObjectStoreRegistry({data_bucket: store})\n",
    "parser = HDFParser()"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 9,
    "id": "c7d02c8f-0e04-4d51-a80b-83e229e14dd9",
    "metadata": {},
    "outputs": [
    {
    "name": "stdout",
    "output_type": "stream",
    "text": [
    "CPU times: user 1.26 s, sys: 370 ms, total: 1.63 s\n",
    "Wall time: 31.9 s\n"
    ]
    }
    ],
    "source": [
    "%%time\n",
    "ds_list = [\n",
    " open_virtual_dataset(\n",
    " url=f,\n",
    " parser=parser,\n",
    " registry=registry, \n",
    " loadable_variables=[\"forecast_initial_time\"],\n",
    " )\n",
    " for f in flist\n",
    "]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 10,
    "id": "6919a6d6-2c4b-4c0e-a974-8557bad7beb7",
    "metadata": {
    "scrolled": true
    },
    "outputs": [
    {
    "ename": "ValueError",
    "evalue": "Cannot concatenate arrays with partial chunks because only regular chunk grids are currently supported. Concat input 0 has array length 30 along the concatenation axis which is not evenly divisible by chunk length 1024.",
    "output_type": "error",
    "traceback": [
    "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
    "\u001b[31mValueError\u001b[39m Traceback (most recent call last)",
    "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[10]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m ds = \u001b[43mxr\u001b[49m\u001b[43m.\u001b[49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2\u001b[39m \u001b[43m \u001b[49m\u001b[43mds_list\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 3\u001b[39m \u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mforecast_initial_time\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[43mcoords\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mminimal\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mcompat\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43moverride\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43mcombine_attrs\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43moverride\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m)\u001b[49m\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/xarray/structure/concat.py:295\u001b[39m, in \u001b[36mconcat\u001b[39m\u001b[34m(objs, dim, data_vars, coords, compat, positions, fill_value, join, combine_attrs, create_index_for_new_dim)\u001b[39m\n\u001b[32m 282\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m _dataarray_concat(\n\u001b[32m 283\u001b[39m objs,\n\u001b[32m 284\u001b[39m dim=dim,\n\u001b[32m (...)\u001b[39m\u001b[32m 292\u001b[39m create_index_for_new_dim=create_index_for_new_dim,\n\u001b[32m 293\u001b[39m )\n\u001b[32m 294\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(first_obj, Dataset):\n\u001b[32m--> \u001b[39m\u001b[32m295\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_dataset_concat\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 296\u001b[39m \u001b[43m \u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 297\u001b[39m \u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdim\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 298\u001b[39m \u001b[43m \u001b[49m\u001b[43mdata_vars\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdata_vars\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 299\u001b[39m \u001b[43m \u001b[49m\u001b[43mcoords\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcoords\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 300\u001b[39m \u001b[43m \u001b[49m\u001b[43mcompat\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcompat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 301\u001b[39m \u001b[43m \u001b[49m\u001b[43mpositions\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpositions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 302\u001b[39m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 303\u001b[39m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[43m=\u001b[49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 304\u001b[39m \u001b[43m \u001b[49m\u001b[43mcombine_attrs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcombine_attrs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 305\u001b[39m \u001b[43m \u001b[49m\u001b[43mcreate_index_for_new_dim\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcreate_index_for_new_dim\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 306\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 307\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 308\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 309\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mcan only concatenate xarray Dataset and DataArray \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 310\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mobjects, got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(first_obj)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 311\u001b[39m )\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/xarray/structure/concat.py:770\u001b[39m, in \u001b[36m_dataset_concat\u001b[39m\u001b[34m(datasets, dim, data_vars, coords, compat, positions, fill_value, join, combine_attrs, create_index_for_new_dim)\u001b[39m\n\u001b[32m 768\u001b[39m result_vars[k] = v\n\u001b[32m 769\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m770\u001b[39m combined_var = \u001b[43mconcat_vars\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 771\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mvars\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdim_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpositions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcombine_attrs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcombine_attrs\u001b[49m\n\u001b[32m 772\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 773\u001b[39m \u001b[38;5;66;03m# reindex if variable is not present in all datasets\u001b[39;00m\n\u001b[32m 774\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(variable_index) < concat_index_size:\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/xarray/core/variable.py:3110\u001b[39m, in \u001b[36mconcat\u001b[39m\u001b[34m(variables, dim, positions, shortcut, combine_attrs)\u001b[39m\n\u001b[32m 3108\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m IndexVariable.concat(variables, dim, positions, shortcut, combine_attrs)\n\u001b[32m 3109\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m3110\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mVariable\u001b[49m\u001b[43m.\u001b[49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvariables\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpositions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshortcut\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcombine_attrs\u001b[49m\u001b[43m)\u001b[49m\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/xarray/core/variable.py:1841\u001b[39m, in \u001b[36mVariable.concat\u001b[39m\u001b[34m(cls, variables, dim, positions, shortcut, combine_attrs)\u001b[39m\n\u001b[32m 1839\u001b[39m axis = first_var.get_axis_num(dim)\n\u001b[32m 1840\u001b[39m dims = first_var_dims\n\u001b[32m-> \u001b[39m\u001b[32m1841\u001b[39m data = \u001b[43mduck_array_ops\u001b[49m\u001b[43m.\u001b[49m\u001b[43mconcatenate\u001b[49m\u001b[43m(\u001b[49m\u001b[43marrays\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m=\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1842\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m positions \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 1843\u001b[39m \u001b[38;5;66;03m# TODO: deprecate this option -- we don't need it for groupby\u001b[39;00m\n\u001b[32m 1844\u001b[39m \u001b[38;5;66;03m# any more.\u001b[39;00m\n\u001b[32m 1845\u001b[39m indices = nputils.inverse_permutation(np.concatenate(positions))\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/xarray/core/duck_array_ops.py:441\u001b[39m, in \u001b[36mconcatenate\u001b[39m\u001b[34m(arrays, axis)\u001b[39m\n\u001b[32m 439\u001b[39m xp = get_array_namespace(*arrays)\n\u001b[32m 440\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(xp, \u001b[33m\"\u001b[39m\u001b[33mconcat\u001b[39m\u001b[33m\"\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m441\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mxp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mas_shared_dtype\u001b[49m\u001b[43m(\u001b[49m\u001b[43marrays\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxp\u001b[49m\u001b[43m=\u001b[49m\u001b[43mxp\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m=\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 442\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 443\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m xp.concatenate(as_shared_dtype(arrays, xp=xp), axis=axis)\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/virtualizarr/manifests/array.py:141\u001b[39m, in \u001b[36mManifestArray.__array_function__\u001b[39m\u001b[34m(self, func, types, args, kwargs)\u001b[39m\n\u001b[32m 138\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28missubclass\u001b[39m(t, ManifestArray) \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m types):\n\u001b[32m 139\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mNotImplemented\u001b[39m\n\u001b[32m--> \u001b[39m\u001b[32m141\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mMANIFESTARRAY_HANDLED_ARRAY_FUNCTIONS\u001b[49m\u001b[43m[\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/virtualizarr/manifests/array_api.py:91\u001b[39m, in \u001b[36mconcatenate\u001b[39m\u001b[34m(arrays, axis)\u001b[39m\n\u001b[32m 89\u001b[39m arr_chunks = [arr.chunks \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m arrays]\n\u001b[32m 90\u001b[39m check_same_shapes_except_on_concat_axis(arr_shapes, axis)\n\u001b[32m---> \u001b[39m\u001b[32m91\u001b[39m \u001b[43mcheck_no_partial_chunks_on_concat_axis\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr_shapes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43marr_chunks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 93\u001b[39m \u001b[38;5;66;03m# find what new array shape must be\u001b[39;00m\n\u001b[32m 94\u001b[39m new_length_along_concat_axis = \u001b[38;5;28msum\u001b[39m([shape[axis] \u001b[38;5;28;01mfor\u001b[39;00m shape \u001b[38;5;129;01min\u001b[39;00m arr_shapes])\n",
    "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.13/site-packages/virtualizarr/manifests/utils.py:173\u001b[39m, in \u001b[36mcheck_no_partial_chunks_on_concat_axis\u001b[39m\u001b[34m(shapes, chunks, axis)\u001b[39m\n\u001b[32m 171\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i, (shape, chunk_shape) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mzip\u001b[39m(shapes, chunks)):\n\u001b[32m 172\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m shape[axis] % chunk_shape[axis] > \u001b[32m0\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m173\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 174\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mCannot concatenate arrays with partial chunks because only regular chunk grids are currently supported. \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 175\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mConcat input \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mi\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m has array length \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mshape[axis]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m along the concatenation axis which is not \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 176\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mevenly divisible by chunk length \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mchunk_shape[axis]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 177\u001b[39m )\n",
    "\u001b[31mValueError\u001b[39m: Cannot concatenate arrays with partial chunks because only regular chunk grids are currently supported. Concat input 0 has array length 30 along the concatenation axis which is not evenly divisible by chunk length 1024."
    ]
    }
    ],
    "source": [
    "ds = xr.concat(\n",
    " ds_list,\n",
    " dim=\"forecast_initial_time\",\n",
    " coords=\"minimal\",\n",
    " compat=\"override\",\n",
    " combine_attrs=\"override\",\n",
    ")"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 14,
    "id": "e304421a-b519-4875-b2d3-272df25023b7",
    "metadata": {},
    "outputs": [
    {
    "name": "stdout",
    "output_type": "stream",
    "text": [
    "(30, 12, 721, 1440)\n",
    "(32, 12, 721, 1440)\n"
    ]
    }
    ],
    "source": [
    "_ = [print(ds.E.shape) for ds in ds_list]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 12,
    "id": "9ecd0a3f-4d29-409a-afad-13513537a5bb",
    "metadata": {},
    "outputs": [
    {
    "name": "stdout",
    "output_type": "stream",
    "text": [
    "(1, 12, 721, 1440)\n",
    "(1, 12, 721, 1440)\n"
    ]
    }
    ],
    "source": [
    "_ = [print(ds.E.chunks) for ds in ds_list]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 13,
    "id": "77badac4-362e-4501-b669-24c6d986bb69",
    "metadata": {},
    "outputs": [
    {
    "data": {
    "text/html": [
    "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
    "<defs>\n",
    "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
    "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
    "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
    "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
    "</symbol>\n",
    "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
    "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
    "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
    "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
    "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
    "</symbol>\n",
    "</defs>\n",
    "</svg>\n",
    "<style>/* CSS stylesheet for displaying xarray objects in notebooks */\n",
    "\n",
    ":root {\n",
    " --xr-font-color0: var(\n",
    " --jp-content-font-color0,\n",
    " var(--pst-color-text-base rgba(0, 0, 0, 1))\n",
    " );\n",
    " --xr-font-color2: var(\n",
    " --jp-content-font-color2,\n",
    " var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n",
    " );\n",
    " --xr-font-color3: var(\n",
    " --jp-content-font-color3,\n",
    " var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n",
    " );\n",
    " --xr-border-color: var(\n",
    " --jp-border-color2,\n",
    " hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n",
    " );\n",
    " --xr-disabled-color: var(\n",
    " --jp-layout-color3,\n",
    " hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n",
    " );\n",
    " --xr-background-color: var(\n",
    " --jp-layout-color0,\n",
    " var(--pst-color-on-background, white)\n",
    " );\n",
    " --xr-background-color-row-even: var(\n",
    " --jp-layout-color1,\n",
    " hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n",
    " );\n",
    " --xr-background-color-row-odd: var(\n",
    " --jp-layout-color2,\n",
    " hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n",
    " );\n",
    "}\n",
    "\n",
    "html[theme=\"dark\"],\n",
    "html[data-theme=\"dark\"],\n",
    "body[data-theme=\"dark\"],\n",
    "body.vscode-dark {\n",
    " --xr-font-color0: var(\n",
    " --jp-content-font-color0,\n",
    " var(--pst-color-text-base, rgba(255, 255, 255, 1))\n",
    " );\n",
    " --xr-font-color2: var(\n",
    " --jp-content-font-color2,\n",
    " var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n",
    " );\n",
    " --xr-font-color3: var(\n",
    " --jp-content-font-color3,\n",
    " var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n",
    " );\n",
    " --xr-border-color: var(\n",
    " --jp-border-color2,\n",
    " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n",
    " );\n",
    " --xr-disabled-color: var(\n",
    " --jp-layout-color3,\n",
    " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n",
    " );\n",
    " --xr-background-color: var(\n",
    " --jp-layout-color0,\n",
    " var(--pst-color-on-background, #111111)\n",
    " );\n",
    " --xr-background-color-row-even: var(\n",
    " --jp-layout-color1,\n",
    " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n",
    " );\n",
    " --xr-background-color-row-odd: var(\n",
    " --jp-layout-color2,\n",
    " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n",
    " );\n",
    "}\n",
    "\n",
    ".xr-wrap {\n",
    " display: block !important;\n",
    " min-width: 300px;\n",
    " max-width: 700px;\n",
    " line-height: 1.6;\n",
    "}\n",
    "\n",
    ".xr-text-repr-fallback {\n",
    " /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
    " display: none;\n",
    "}\n",
    "\n",
    ".xr-header {\n",
    " padding-top: 6px;\n",
    " padding-bottom: 6px;\n",
    " margin-bottom: 4px;\n",
    " border-bottom: solid 1px var(--xr-border-color);\n",
    "}\n",
    "\n",
    ".xr-header > div,\n",
    ".xr-header > ul {\n",
    " display: inline;\n",
    " margin-top: 0;\n",
    " margin-bottom: 0;\n",
    "}\n",
    "\n",
    ".xr-obj-type,\n",
    ".xr-obj-name,\n",
    ".xr-group-name {\n",
    " margin-left: 2px;\n",
    " margin-right: 10px;\n",
    "}\n",
    "\n",
    ".xr-group-name::before {\n",
    " content: \"📁\";\n",
    " padding-right: 0.3em;\n",
    "}\n",
    "\n",
    ".xr-group-name,\n",
    ".xr-obj-type {\n",
    " color: var(--xr-font-color2);\n",
    "}\n",
    "\n",
    ".xr-sections {\n",
    " padding-left: 0 !important;\n",
    " display: grid;\n",
    " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n",
    " margin-block-start: 0;\n",
    " margin-block-end: 0;\n",
    "}\n",
    "\n",
    ".xr-section-item {\n",
    " display: contents;\n",
    "}\n",
    "\n",
    ".xr-section-item input {\n",
    " display: inline-block;\n",
    " opacity: 0;\n",
    " height: 0;\n",
    " margin: 0;\n",
    "}\n",
    "\n",
    ".xr-section-item input + label {\n",
    " color: var(--xr-disabled-color);\n",
    " border: 2px solid transparent !important;\n",
    "}\n",
    "\n",
    ".xr-section-item input:enabled + label {\n",
    " cursor: pointer;\n",
    " color: var(--xr-font-color2);\n",
    "}\n",
    "\n",
    ".xr-section-item input:focus + label {\n",
    " border: 2px solid var(--xr-font-color0) !important;\n",
    "}\n",
    "\n",
    ".xr-section-item input:enabled + label:hover {\n",
    " color: var(--xr-font-color0);\n",
    "}\n",
    "\n",
    ".xr-section-summary {\n",
    " grid-column: 1;\n",
    " color: var(--xr-font-color2);\n",
    " font-weight: 500;\n",
    "}\n",
    "\n",
    ".xr-section-summary > span {\n",
    " display: inline-block;\n",
    " padding-left: 0.5em;\n",
    "}\n",
    "\n",
    ".xr-section-summary-in:disabled + label {\n",
    " color: var(--xr-font-color2);\n",
    "}\n",
    "\n",
    ".xr-section-summary-in + label:before {\n",
    " display: inline-block;\n",
    " content: \"\";\n",
    " font-size: 11px;\n",
    " width: 15px;\n",
    " text-align: center;\n",
    "}\n",
    "\n",
    ".xr-section-summary-in:disabled + label:before {\n",
    " color: var(--xr-disabled-color);\n",
    "}\n",
    "\n",
    ".xr-section-summary-in:checked + label:before {\n",
    " content: \"\";\n",
    "}\n",
    "\n",
    ".xr-section-summary-in:checked + label > span {\n",
    " display: none;\n",
    "}\n",
    "\n",
    ".xr-section-summary,\n",
    ".xr-section-inline-details {\n",
    " padding-top: 4px;\n",
    "}\n",
    "\n",
    ".xr-section-inline-details {\n",
    " grid-column: 2 / -1;\n",
    "}\n",
    "\n",
    ".xr-section-details {\n",
    " display: none;\n",
    " grid-column: 1 / -1;\n",
    " margin-top: 4px;\n",
    " margin-bottom: 5px;\n",
    "}\n",
    "\n",
    ".xr-section-summary-in:checked ~ .xr-section-details {\n",
    " display: contents;\n",
    "}\n",
    "\n",
    ".xr-group-box {\n",
    " display: inline-grid;\n",
    " grid-template-columns: 0px 20px auto;\n",
    " width: 100%;\n",
    "}\n",
    "\n",
    ".xr-group-box-vline {\n",
    " grid-column-start: 1;\n",
    " border-right: 0.2em solid;\n",
    " border-color: var(--xr-border-color);\n",
    " width: 0px;\n",
    "}\n",
    "\n",
    ".xr-group-box-hline {\n",
    " grid-column-start: 2;\n",
    " grid-row-start: 1;\n",
    " height: 1em;\n",
    " width: 20px;\n",
    " border-bottom: 0.2em solid;\n",
    " border-color: var(--xr-border-color);\n",
    "}\n",
    "\n",
    ".xr-group-box-contents {\n",
    " grid-column-start: 3;\n",
    "}\n",
    "\n",
    ".xr-array-wrap {\n",
    " grid-column: 1 / -1;\n",
    " display: grid;\n",
    " grid-template-columns: 20px auto;\n",
    "}\n",
    "\n",
    ".xr-array-wrap > label {\n",
    " grid-column: 1;\n",
    " vertical-align: top;\n",
    "}\n",
    "\n",
    ".xr-preview {\n",
    " color: var(--xr-font-color3);\n",
    "}\n",
    "\n",
    ".xr-array-preview,\n",
    ".xr-array-data {\n",
    " padding: 0 5px !important;\n",
    " grid-column: 2;\n",
    "}\n",
    "\n",
    ".xr-array-data,\n",
    ".xr-array-in:checked ~ .xr-array-preview {\n",
    " display: none;\n",
    "}\n",
    "\n",
    ".xr-array-in:checked ~ .xr-array-data,\n",
    ".xr-array-preview {\n",
    " display: inline-block;\n",
    "}\n",
    "\n",
    ".xr-dim-list {\n",
    " display: inline-block !important;\n",
    " list-style: none;\n",
    " padding: 0 !important;\n",
    " margin: 0;\n",
    "}\n",
    "\n",
    ".xr-dim-list li {\n",
    " display: inline-block;\n",
    " padding: 0;\n",
    " margin: 0;\n",
    "}\n",
    "\n",
    ".xr-dim-list:before {\n",
    " content: \"(\";\n",
    "}\n",
    "\n",
    ".xr-dim-list:after {\n",
    " content: \")\";\n",
    "}\n",
    "\n",
    ".xr-dim-list li:not(:last-child):after {\n",
    " content: \",\";\n",
    " padding-right: 5px;\n",
    "}\n",
    "\n",
    ".xr-has-index {\n",
    " font-weight: bold;\n",
    "}\n",
    "\n",
    ".xr-var-list,\n",
    ".xr-var-item {\n",
    " display: contents;\n",
    "}\n",
    "\n",
    ".xr-var-item > div,\n",
    ".xr-var-item label,\n",
    ".xr-var-item > .xr-var-name span {\n",
    " background-color: var(--xr-background-color-row-even);\n",
    " border-color: var(--xr-background-color-row-odd);\n",
    " margin-bottom: 0;\n",
    " padding-top: 2px;\n",
    "}\n",
    "\n",
    ".xr-var-item > .xr-var-name:hover span {\n",
    " padding-right: 5px;\n",
    "}\n",
    "\n",
    ".xr-var-list > li:nth-child(odd) > div,\n",
    ".xr-var-list > li:nth-child(odd) > label,\n",
    ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
    " background-color: var(--xr-background-color-row-odd);\n",
    " border-color: var(--xr-background-color-row-even);\n",
    "}\n",
    "\n",
    ".xr-var-name {\n",
    " grid-column: 1;\n",
    "}\n",
    "\n",
    ".xr-var-dims {\n",
    " grid-column: 2;\n",
    "}\n",
    "\n",
    ".xr-var-dtype {\n",
    " grid-column: 3;\n",
    " text-align: right;\n",
    " color: var(--xr-font-color2);\n",
    "}\n",
    "\n",
    ".xr-var-preview {\n",
    " grid-column: 4;\n",
    "}\n",
    "\n",
    ".xr-index-preview {\n",
    " grid-column: 2 / 5;\n",
    " color: var(--xr-font-color2);\n",
    "}\n",
    "\n",
    ".xr-var-name,\n",
    ".xr-var-dims,\n",
    ".xr-var-dtype,\n",
    ".xr-preview,\n",
    ".xr-attrs dt {\n",
    " white-space: nowrap;\n",
    " overflow: hidden;\n",
    " text-overflow: ellipsis;\n",
    " padding-right: 10px;\n",
    "}\n",
    "\n",
    ".xr-var-name:hover,\n",
    ".xr-var-dims:hover,\n",
    ".xr-var-dtype:hover,\n",
    ".xr-attrs dt:hover {\n",
    " overflow: visible;\n",
    " width: auto;\n",
    " z-index: 1;\n",
    "}\n",
    "\n",
    ".xr-var-attrs,\n",
    ".xr-var-data,\n",
    ".xr-index-data {\n",
    " display: none;\n",
    " border-top: 2px dotted var(--xr-background-color);\n",
    " padding-bottom: 20px !important;\n",
    " padding-top: 10px !important;\n",
    "}\n",
    "\n",
    ".xr-var-attrs-in + label,\n",
    ".xr-var-data-in + label,\n",
    ".xr-index-data-in + label {\n",
    " padding: 0 1px;\n",
    "}\n",
    "\n",
    ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
    ".xr-var-data-in:checked ~ .xr-var-data,\n",
    ".xr-index-data-in:checked ~ .xr-index-data {\n",
    " display: block;\n",
    "}\n",
    "\n",
    ".xr-var-data > table {\n",
    " float: right;\n",
    "}\n",
    "\n",
    ".xr-var-data > pre,\n",
    ".xr-index-data > pre,\n",
    ".xr-var-data > table > tbody > tr {\n",
    " background-color: transparent !important;\n",
    "}\n",
    "\n",
    ".xr-var-name span,\n",
    ".xr-var-data,\n",
    ".xr-index-name div,\n",
    ".xr-index-data,\n",
    ".xr-attrs {\n",
    " padding-left: 25px !important;\n",
    "}\n",
    "\n",
    ".xr-attrs,\n",
    ".xr-var-attrs,\n",
    ".xr-var-data,\n",
    ".xr-index-data {\n",
    " grid-column: 1 / -1;\n",
    "}\n",
    "\n",
    "dl.xr-attrs {\n",
    " padding: 0;\n",
    " margin: 0;\n",
    " display: grid;\n",
    " grid-template-columns: 125px auto;\n",
    "}\n",
    "\n",
    ".xr-attrs dt,\n",
    ".xr-attrs dd {\n",
    " padding: 0;\n",
    " margin: 0;\n",
    " float: left;\n",
    " padding-right: 10px;\n",
    " width: auto;\n",
    "}\n",
    "\n",
    ".xr-attrs dt {\n",
    " font-weight: normal;\n",
    " grid-column: 1;\n",
    "}\n",
    "\n",
    ".xr-attrs dt:hover span {\n",
    " display: inline-block;\n",
    " background: var(--xr-background-color);\n",
    " padding-right: 10px;\n",
    "}\n",
    "\n",
    ".xr-attrs dd {\n",
    " grid-column: 2;\n",
    " white-space: pre-wrap;\n",
    " word-break: break-all;\n",
    "}\n",
    "\n",
    ".xr-icon-database,\n",
    ".xr-icon-file-text2,\n",
    ".xr-no-icon {\n",
    " display: inline-block;\n",
    " vertical-align: middle;\n",
    " width: 1em;\n",
    " height: 1.5em !important;\n",
    " stroke-width: 0;\n",
    " stroke: currentColor;\n",
    " fill: currentColor;\n",
    "}\n",
    "\n",
    ".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n",
    ".xr-var-data-in:checked + label > .xr-icon-database,\n",
    ".xr-index-data-in:checked + label > .xr-icon-database {\n",
    " color: var(--xr-font-color0);\n",
    " filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n",
    " stroke-width: 0.8px;\n",
    "}\n",
    "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt; Size: 1GB\n",
    "Dimensions: (forecast_initial_time: 30, forecast_hour: 12,\n",
    " latitude: 721, longitude: 1440)\n",
    "Coordinates:\n",
    " * forecast_initial_time (forecast_initial_time) datetime64[ns] 240B 1960-0...\n",
    " forecast_hour (forecast_hour) int32 48B ManifestArray&lt;shape=(12,...\n",
    " latitude (latitude) float64 6kB ManifestArray&lt;shape=(721,),...\n",
    " longitude (longitude) float64 12kB ManifestArray&lt;shape=(1440...\n",
    "Data variables:\n",
    " E (forecast_initial_time, forecast_hour, latitude, longitude) float32 1GB ManifestArray&lt;shape=(30, 12, 721, 1440), dtype=float32, chun...\n",
    " utc_date (forecast_initial_time) int32 120B ManifestArray&lt;s...\n",
    "Attributes:\n",
    " DATA_SOURCE: ECMWF: https://cds.climate.copernicus.eu, Copernicu...\n",
    " NETCDF_CONVERSION: CISL RDA: Conversion from ECMWF GRIB1 data to netCDF4.\n",
    " NETCDF_VERSION: 4.8.1\n",
    " CONVERSION_PLATFORM: Linux r8i3n21 4.12.14-95.51-default #1 SMP Fri Apr ...\n",
    " CONVERSION_DATE: Mon Jun 27 14:39:26 MDT 2022\n",
    " Conventions: CF-1.6\n",
    " NETCDF_COMPRESSION: NCO: Precision-preserving compression to netCDF4/HD...\n",
    " history: Mon Jun 27 14:39:34 2022: ncks -4 --ppc default=7 e...\n",
    " NCO: netCDF Operators version 5.0.3 (Homepage = http://n...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-f1665fe4-9b6e-4420-8607-e89279a7c9c6' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-f1665fe4-9b6e-4420-8607-e89279a7c9c6' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>forecast_initial_time</span>: 30</li><li><span>forecast_hour</span>: 12</li><li><span>latitude</span>: 721</li><li><span>longitude</span>: 1440</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-5e8796b2-05cb-4924-90be-78a311ef74cb' class='xr-section-summary-in' type='checkbox' checked><label for='section-5e8796b2-05cb-4924-90be-78a311ef74cb' class='xr-section-summary' >Coordinates: <span>(4)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>forecast_initial_time</span></div><div class='xr-var-dims'>(forecast_initial_time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>1960-01-01T06:00:00 ... 1960-01-...</div><input id='attrs-038fe4c1-91fb-4741-ab81-faf409760fc4' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-038fe4c1-91fb-4741-ab81-faf409760fc4' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-0a3630f5-5dfb-47d7-9786-4b7596bbe669' class='xr-var-data-in' type='checkbox'><label for='data-0a3630f5-5dfb-47d7-9786-4b7596bbe669' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>forecast initial time</dd><dt><span>short_name :</span></dt><dd>fitime</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array([&#x27;1960-01-01T06:00:00.000000000&#x27;, &#x27;1960-01-01T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-02T06:00:00.000000000&#x27;, &#x27;1960-01-02T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-03T06:00:00.000000000&#x27;, &#x27;1960-01-03T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-04T06:00:00.000000000&#x27;, &#x27;1960-01-04T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-05T06:00:00.000000000&#x27;, &#x27;1960-01-05T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-06T06:00:00.000000000&#x27;, &#x27;1960-01-06T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-07T06:00:00.000000000&#x27;, &#x27;1960-01-07T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-08T06:00:00.000000000&#x27;, &#x27;1960-01-08T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-09T06:00:00.000000000&#x27;, &#x27;1960-01-09T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-10T06:00:00.000000000&#x27;, &#x27;1960-01-10T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-11T06:00:00.000000000&#x27;, &#x27;1960-01-11T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-12T06:00:00.000000000&#x27;, &#x27;1960-01-12T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-13T06:00:00.000000000&#x27;, &#x27;1960-01-13T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-14T06:00:00.000000000&#x27;, &#x27;1960-01-14T18:00:00.000000000&#x27;,\n",
    " &#x27;1960-01-15T06:00:00.000000000&#x27;, &#x27;1960-01-15T18:00:00.000000000&#x27;],\n",
    " dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>forecast_hour</span></div><div class='xr-var-dims'>(forecast_hour)</div><div class='xr-var-dtype'>int32</div><div class='xr-var-preview xr-preview'>ManifestArray&lt;shape=(12,), dtype...</div><input id='attrs-7f267d99-be41-4276-b0fc-9c2cd6fc5e37' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-7f267d99-be41-4276-b0fc-9c2cd6fc5e37' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-4345e204-b36f-4d7c-8b84-fee9ca056c45' class='xr-var-data-in' type='checkbox'><label for='data-4345e204-b36f-4d7c-8b84-fee9ca056c45' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>forecast hour</dd><dt><span>short_name :</span></dt><dd>fhr</dd><dt><span>standard_name :</span></dt><dd>forecast_period</dd><dt><span>units :</span></dt><dd>hour</dd><dt><span>units_qualifier :</span></dt><dd>hours since forecast_initial_time</dd></dl></div><div class='xr-var-data'><pre>ManifestArray&lt;shape=(12,), dtype=int32, chunks=(12,)&gt;</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(latitude)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>ManifestArray&lt;shape=(721,), dtyp...</div><input id='attrs-2c2c6b35-0095-4637-a5d7-1c316c3990e8' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2c2c6b35-0095-4637-a5d7-1c316c3990e8' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-cf7a78c0-8445-4373-9230-eb0547729ac0' class='xr-var-data-in' type='checkbox'><label for='data-cf7a78c0-8445-4373-9230-eb0547729ac0' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>latitude</dd><dt><span>short_name :</span></dt><dd>lat</dd><dt><span>units :</span></dt><dd>degrees_north</dd></dl></div><div class='xr-var-data'><pre>ManifestArray&lt;shape=(721,), dtype=float64, chunks=(721,)&gt;</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(longitude)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>ManifestArray&lt;shape=(1440,), dty...</div><input id='attrs-75e3a880-d14e-41fa-a8f1-a99c95694509' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-75e3a880-d14e-41fa-a8f1-a99c95694509' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-da527bdb-6e9e-4345-8c4a-f5d91865fe52' class='xr-var-data-in' type='checkbox'><label for='data-da527bdb-6e9e-4345-8c4a-f5d91865fe52' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>longitude</dd><dt><span>short_name :</span></dt><dd>lon</dd><dt><span>units :</span></dt><dd>degrees_east</dd></dl></div><div class='xr-var-data'><pre>ManifestArray&lt;shape=(1440,), dtype=float64, chunks=(1440,)&gt;</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-24b2057b-3481-4e88-a7e7-a21f3332724e' class='xr-section-summary-in' type='checkbox' checked><label for='section-24b2057b-3481-4e88-a7e7-a21f3332724e' class='xr-section-summary' >Data variables: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>E</span></div><div class='xr-var-dims'>(forecast_initial_time, forecast_hour, latitude, longitude)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>ManifestArray&lt;shape=(30, 12, 721...</div><input id='attrs-a8043eb5-0ecd-467c-ada2-1b7c8c43110e' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-a8043eb5-0ecd-467c-ada2-1b7c8c43110e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b300f36e-690b-46f6-847c-c149f36de914' class='xr-var-data-in' type='checkbox'><label for='data-b300f36e-690b-46f6-847c-c149f36de914' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Evaporation</dd><dt><span>short_name :</span></dt><dd>e</dd><dt><span>units :</span></dt><dd>m of water equivalent</dd><dt><span>original_format :</span></dt><dd>WMO GRIB 1 with ECMWF local table</dd><dt><span>ecmwf_local_table :</span></dt><dd>128</dd><dt><span>ecmwf_parameter :</span></dt><dd>182</dd><dt><span>_FillValue :</span></dt><dd>AAAAQDMaS0Q=</dd><dt><span>missing_value :</span></dt><dd>9.999000260554009e+20</dd><dt><span>minimum_value :</span></dt><dd>-0.001647725235670805</dd><dt><span>maximum_value :</span></dt><dd>0.0003123336937278509</dd><dt><span>grid_specification :</span></dt><dd>0.25 degree x 0.25 degree from 90N to 90S and 0E to 359.75E (721 x 1440 Latitude/Longitude)</dd><dt><span>rda_dataset :</span></dt><dd>ds633.0</dd><dt><span>rda_dataset_url :</span></dt><dd>https:/rda.ucar.edu/datasets/ds633.0/</dd><dt><span>rda_dataset_doi :</span></dt><dd>DOI: 10.5065/BH6N-5N20</dd><dt><span>rda_dataset_group :</span></dt><dd>ERA5 atmospheric surface forecast (accumulated) [netCDF4]</dd><dt><span>QuantizeGranularBitGroomNumberOfSignificantDigits :</span></dt><dd>7</dd></dl></div><div class='xr-var-data'><pre>ManifestArray&lt;shape=(30, 12, 721, 1440), dtype=float32, chunks=(1, 12, 721, 1440)&gt;</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>utc_date</span></div><div class='xr-var-dims'>(forecast_initial_time)</div><div class='xr-var-dtype'>int32</div><div class='xr-var-preview xr-preview'>ManifestArray&lt;shape=(30,), dtype...</div><input id='attrs-0e6ee8e8-9d90-4ed8-994a-7702ce726577' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-0e6ee8e8-9d90-4ed8-994a-7702ce726577' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e55fd8de-4216-4ce5-93a8-8e77da054abe' class='xr-var-data-in' type='checkbox'><label for='data-e55fd8de-4216-4ce5-93a8-8e77da054abe' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>UTC date yyyy-mm-dd hh:00:00 as yyyymmddhh</dd><dt><span>units :</span></dt><dd>Gregorian_year month day hour</dd></dl></div><div class='xr-var-data'><pre>ManifestArray&lt;shape=(30,), dtype=int32, chunks=(1024,)&gt;</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-b32925ca-1233-4bce-97ee-b5ebffdd94a4' class='xr-section-summary-in' type='checkbox' checked><label for='section-b32925ca-1233-4bce-97ee-b5ebffdd94a4' class='xr-section-summary' >Attributes: <span>(9)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>DATA_SOURCE :</span></dt><dd>ECMWF: https://cds.climate.copernicus.eu, Copernicus Climate Data Store</dd><dt><span>NETCDF_CONVERSION :</span></dt><dd>CISL RDA: Conversion from ECMWF GRIB1 data to netCDF4.</dd><dt><span>NETCDF_VERSION :</span></dt><dd>4.8.1</dd><dt><span>CONVERSION_PLATFORM :</span></dt><dd>Linux r8i3n21 4.12.14-95.51-default #1 SMP Fri Apr 17 08:14:12 UTC 2020 (c6bab98) x86_64 x86_64 x86_64 GNU/Linux</dd><dt><span>CONVERSION_DATE :</span></dt><dd>Mon Jun 27 14:39:26 MDT 2022</dd><dt><span>Conventions :</span></dt><dd>CF-1.6</dd><dt><span>NETCDF_COMPRESSION :</span></dt><dd>NCO: Precision-preserving compression to netCDF4/HDF5 (see &quot;history&quot; and &quot;NCO&quot; global attributes below for specifics).</dd><dt><span>history :</span></dt><dd>Mon Jun 27 14:39:34 2022: ncks -4 --ppc default=7 e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1960010106_1960011606.unc.nc e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1960010106_1960011606.nc</dd><dt><span>NCO :</span></dt><dd>netCDF Operators version 5.0.3 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)</dd></dl></div></li></ul></div></div>"
    ],
    "text/plain": [
    "<xarray.Dataset> Size: 1GB\n",
    "Dimensions: (forecast_initial_time: 30, forecast_hour: 12,\n",
    " latitude: 721, longitude: 1440)\n",
    "Coordinates:\n",
    " * forecast_initial_time (forecast_initial_time) datetime64[ns] 240B 1960-0...\n",
    " forecast_hour (forecast_hour) int32 48B ManifestArray<shape=(12,...\n",
    " latitude (latitude) float64 6kB ManifestArray<shape=(721,),...\n",
    " longitude (longitude) float64 12kB ManifestArray<shape=(1440...\n",
    "Data variables:\n",
    " E (forecast_initial_time, forecast_hour, latitude, longitude) float32 1GB ManifestArray<shape=(30, 12, 721, 1440), dtype=float32, chun...\n",
    " utc_date (forecast_initial_time) int32 120B ManifestArray<s...\n",
    "Attributes:\n",
    " DATA_SOURCE: ECMWF: https://cds.climate.copernicus.eu, Copernicu...\n",
    " NETCDF_CONVERSION: CISL RDA: Conversion from ECMWF GRIB1 data to netCDF4.\n",
    " NETCDF_VERSION: 4.8.1\n",
    " CONVERSION_PLATFORM: Linux r8i3n21 4.12.14-95.51-default #1 SMP Fri Apr ...\n",
    " CONVERSION_DATE: Mon Jun 27 14:39:26 MDT 2022\n",
    " Conventions: CF-1.6\n",
    " NETCDF_COMPRESSION: NCO: Precision-preserving compression to netCDF4/HD...\n",
    " history: Mon Jun 27 14:39:34 2022: ncks -4 --ppc default=7 e...\n",
    " NCO: netCDF Operators version 5.0.3 (Homepage = http://n..."
    ]
    },
    "execution_count": 13,
    "metadata": {},
    "output_type": "execute_result"
    }
    ],
    "source": [
    "ds_list[0]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": null,
    "id": "439a1e3c-6428-4eb1-9a98-7850c599b69a",
    "metadata": {},
    "outputs": [],
    "source": [
    "ds_list[1]"
    ]
    }
    ],
    "metadata": {
    "kernelspec": {
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
    },
    "language_info": {
    "codemirror_mode": {
    "name": "ipython",
    "version": 3
    },
    "file_extension": ".py",
    "mimetype": "text/x-python",
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
    "version": "3.13.8"
    }
    },
    "nbformat": 4,
    "nbformat_minor": 5
    }