Skip to content

Instantly share code, notes, and snippets.

@rsignell
Created October 17, 2025 20:41
Show Gist options
  • Save rsignell/dbd3e09dc026a9ba72f26ef8e64aedc9 to your computer and use it in GitHub Desktop.
Save rsignell/dbd3e09dc026a9ba72f26ef8e64aedc9 to your computer and use it in GitHub Desktop.

Revisions

  1. rsignell created this gist Oct 17, 2025.
    1,086 changes: 1,086 additions & 0 deletions era5_evap_create.ipynb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1086 @@
    {
    "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": "03fae159-4235-4312-bc31-00a1df894a39",
    "metadata": {},
    "outputs": [],
    "source": [
    "import icechunk"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 3,
    "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": 4,
    "id": "5c93f342-4239-4557-ba48-f12eff688a1f",
    "metadata": {},
    "outputs": [],
    "source": [
    "data_bucket = \"s3://nsf-ncar-era5\""
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 5,
    "id": "43d26f75-92ab-4313-baad-fc49c1874fb3",
    "metadata": {},
    "outputs": [],
    "source": [
    "import os\n",
    "from dotenv import load_dotenv\n",
    "_ = load_dotenv(f'{os.environ['HOME']}/dotenv/rsignell4.env')\n",
    "\n",
    "# Define Icechunk storage\n",
    "storage_endpoint = 'https://pangeo-eosc-minioapi.vm.fedcloud.eu'\n",
    "storage_bucket = 'rsignell4-protocoast'\n",
    "storage_name = 'era5-evap-icechunk'"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 6,
    "id": "86456d60-5658-47e6-ba9d-ad6cf794add2",
    "metadata": {},
    "outputs": [],
    "source": [
    "storage = icechunk.s3_storage(\n",
    " bucket=storage_bucket,\n",
    " prefix=f\"icechunk/{storage_name}\",\n",
    " from_env=True,\n",
    " endpoint_url=storage_endpoint,\n",
    " region='not-used', # N/A for Pangeo-EOSC bucket, but required param\n",
    " force_path_style=True)"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 7,
    "id": "16df58d3-97cb-4a84-b079-6e8d2164c271",
    "metadata": {},
    "outputs": [],
    "source": [
    "config = icechunk.RepositoryConfig.default()\n",
    "config.set_virtual_chunk_container(\n",
    " icechunk.VirtualChunkContainer(\n",
    " url_prefix=f\"{data_bucket}/\",\n",
    " store=icechunk.s3_store(region=\"us-west-2\", anonymous=True, s3_compatible=True, \n",
    " force_path_style=True),\n",
    " ),\n",
    ")"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 8,
    "id": "e5478c68-745e-423c-ac1e-eedf997bc992",
    "metadata": {},
    "outputs": [],
    "source": [
    "import fsspec\n",
    "fs = fsspec.filesystem('s3', anon=True)\n",
    "fs_write = fsspec.filesystem('s3', anon=False, endpoint_url=storage_endpoint)"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 9,
    "id": "cafaa143-8260-4fd2-90cf-d9c0a4bfae31",
    "metadata": {},
    "outputs": [],
    "source": [
    "mon_list = fs.ls(f'{data_bucket}/e5.oper.fc.sfc.accumu/')[1:]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 10,
    "id": "6aba3edb-f5df-48d3-ad30-5bf7eccbcfd6",
    "metadata": {},
    "outputs": [
    {
    "name": "stdout",
    "output_type": "stream",
    "text": [
    "nsf-ncar-era5/e5.oper.fc.sfc.accumu/194001\n",
    "nsf-ncar-era5/e5.oper.fc.sfc.accumu/202506\n"
    ]
    }
    ],
    "source": [
    "print(mon_list[0])\n",
    "print(mon_list[-1])"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 11,
    "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": 12,
    "id": "3a9a2b79-6806-40c9-8455-e0d5f275a6b3",
    "metadata": {},
    "outputs": [],
    "source": [
    "credentials = icechunk.containers_credentials({f\"s3://{data_bucket}/\": icechunk.s3_credentials(anonymous=True)})"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 13,
    "id": "77badac4-362e-4501-b669-24c6d986bb69",
    "metadata": {},
    "outputs": [],
    "source": [
    "def fix_ds(ds):\n",
    " return ds.drop_vars(['utc_date']) # <<= This 'utc_date' was making xr.concat bomb out, so we drop it"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 14,
    "id": "76d8f197-9e6e-430f-a1a4-9ce04666b778",
    "metadata": {},
    "outputs": [],
    "source": [
    "def create_or_append(flist, create=False):\n",
    " flist = [f's3://{f}' for f in flist]\n",
    " if create:\n",
    " # remove old existing icechunk storage with this name\n",
    " try:\n",
    " # Use the same prefix as the storage\n",
    " fs_write.rm(f's3://{storage_bucket}/icechunk/{storage_name}', recursive=True)\n",
    " print('removing old icechunk storage')\n",
    " except:\n",
    " pass\n",
    "\n",
    " ds_list = [\n",
    " open_virtual_dataset(\n",
    " url=f,\n",
    " parser=parser,\n",
    " registry=registry, \n",
    " loadable_variables=[\"forecast_initial_time\"]) for f in flist]\n",
    "\n",
    " ds_list = [fix_ds(ds) for ds in ds_list]\n",
    "\n",
    " ds = xr.concat(\n",
    " ds_list,\n",
    " dim=\"forecast_initial_time\",\n",
    " coords=\"minimal\",\n",
    " compat=\"override\",\n",
    " combine_attrs=\"override\",\n",
    " )\n",
    " if create:\n",
    " repo = icechunk.Repository.create(storage, config)\n",
    " session = repo.writable_session(\"main\")\n",
    " ds.virtualize.to_icechunk(session.store)\n",
    " session.commit(\"Initial ERA5 Evap creation\")\n",
    " else:\n",
    " repo = icechunk.Repository.open(storage, config, authorize_virtual_chunk_access=credentials)\n",
    " append_session = repo.writable_session(\"main\")\n",
    " ds.virtualize.to_icechunk(append_session.store, append_dim=\"forecast_initial_time\")\n",
    " append_session.commit(\"Append more ERA5 Evap Files\")"
    ]
    },
    {
    "cell_type": "markdown",
    "id": "6409a6e0-4fbc-4d8d-a08b-ad32256df705",
    "metadata": {},
    "source": [
    "## Create the icechunk using mon_list[0]"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 15,
    "id": "51b7bfb5-9b86-49cc-8f38-235f6ce96454",
    "metadata": {},
    "outputs": [
    {
    "data": {
    "text/plain": [
    "['nsf-ncar-era5/e5.oper.fc.sfc.accumu/194001/e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1940010106_1940011606.nc',\n",
    " 'nsf-ncar-era5/e5.oper.fc.sfc.accumu/194001/e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1940011606_1940020106.nc']"
    ]
    },
    "execution_count": 15,
    "metadata": {},
    "output_type": "execute_result"
    }
    ],
    "source": [
    "flist = fs.glob(f'{mon_list[0]}/*128_182_e*.nc')\n",
    "create_or_append(flist, create=True)"
    ]
    },
    {
    "cell_type": "markdown",
    "id": "94aa8d1e-8f40-41b9-9dab-0c72e6e22cc3",
    "metadata": {},
    "source": [
    "## Append all the other months"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": null,
    "id": "d11bfa53-442f-447f-9c37-ce93842834c3",
    "metadata": {},
    "outputs": [],
    "source": [
    "%%time\n",
    "for mon in mon_list[1:]: # <== starting at mon_list[1] because we used mon_list[0] to create\n",
    " print(mon)\n",
    " flist = fs.glob(f'{mon}/*128_182_e*.nc')\n",
    " create_or_append(flist, create=False)"
    ]
    },
    {
    "cell_type": "markdown",
    "id": "5c951f69-7734-4983-aadf-39f8e4322124",
    "metadata": {},
    "source": [
    "## Check that it worked"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": 18,
    "id": "72b63d0e-0311-4686-b315-292126ccbc14",
    "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: 9GB\n",
    "Dimensions: (forecast_initial_time: 182, forecast_hour: 12,\n",
    " latitude: 721, longitude: 1440)\n",
    "Coordinates:\n",
    " * forecast_initial_time (forecast_initial_time) datetime64[ns] 1kB 1940-01...\n",
    " * forecast_hour (forecast_hour) int32 48B 1 2 3 4 5 6 7 8 9 10 11 12\n",
    " * latitude (latitude) float64 6kB 90.0 89.75 ... -89.75 -90.0\n",
    " * longitude (longitude) float64 12kB 0.0 0.25 0.5 ... 359.5 359.8\n",
    "Data variables:\n",
    " E (forecast_initial_time, forecast_hour, latitude, longitude) float32 9GB dask.array&lt;chunksize=(5, 12, 721, 1440), meta=np.ndarray&gt;\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 r4i0n8 4.12.14-95.51-default #1 SMP Fri Apr 1...\n",
    " CONVERSION_DATE: Fri Mar 17 12:52:09 MDT 2023\n",
    " Conventions: CF-1.6\n",
    " NETCDF_COMPRESSION: NCO: Precision-preserving compression to netCDF4/HD...\n",
    " history: Fri Mar 17 12:52:18 2023: 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-1e054b23-46b1-46a0-8958-6a3925ce17e8' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-1e054b23-46b1-46a0-8958-6a3925ce17e8' 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>: 182</li><li><span class='xr-has-index'>forecast_hour</span>: 12</li><li><span class='xr-has-index'>latitude</span>: 721</li><li><span class='xr-has-index'>longitude</span>: 1440</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-d87e4344-3ed3-4109-8290-b6cbdc8072fc' class='xr-section-summary-in' type='checkbox' checked><label for='section-d87e4344-3ed3-4109-8290-b6cbdc8072fc' 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'>1940-01-01T06:00:00 ... 1940-03-...</div><input id='attrs-4be80870-cbaa-4492-bc9e-223bf1522a19' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-4be80870-cbaa-4492-bc9e-223bf1522a19' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a5fd1216-3c88-4871-af7c-230435085722' class='xr-var-data-in' type='checkbox'><label for='data-a5fd1216-3c88-4871-af7c-230435085722' 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;1940-01-01T06:00:00.000000000&#x27;, &#x27;1940-01-01T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-02T06:00:00.000000000&#x27;, &#x27;1940-01-02T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-03T06:00:00.000000000&#x27;, &#x27;1940-01-03T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-04T06:00:00.000000000&#x27;, &#x27;1940-01-04T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-05T06:00:00.000000000&#x27;, &#x27;1940-01-05T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-06T06:00:00.000000000&#x27;, &#x27;1940-01-06T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-07T06:00:00.000000000&#x27;, &#x27;1940-01-07T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-08T06:00:00.000000000&#x27;, &#x27;1940-01-08T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-09T06:00:00.000000000&#x27;, &#x27;1940-01-09T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-10T06:00:00.000000000&#x27;, &#x27;1940-01-10T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-11T06:00:00.000000000&#x27;, &#x27;1940-01-11T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-12T06:00:00.000000000&#x27;, &#x27;1940-01-12T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-13T06:00:00.000000000&#x27;, &#x27;1940-01-13T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-14T06:00:00.000000000&#x27;, &#x27;1940-01-14T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-15T06:00:00.000000000&#x27;, &#x27;1940-01-15T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-16T06:00:00.000000000&#x27;, &#x27;1940-01-16T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-17T06:00:00.000000000&#x27;, &#x27;1940-01-17T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-18T06:00:00.000000000&#x27;, &#x27;1940-01-18T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-19T06:00:00.000000000&#x27;, &#x27;1940-01-19T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-20T06:00:00.000000000&#x27;, &#x27;1940-01-20T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-21T06:00:00.000000000&#x27;, &#x27;1940-01-21T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-22T06:00:00.000000000&#x27;, &#x27;1940-01-22T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-23T06:00:00.000000000&#x27;, &#x27;1940-01-23T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-24T06:00:00.000000000&#x27;, &#x27;1940-01-24T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-25T06:00:00.000000000&#x27;, &#x27;1940-01-25T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-26T06:00:00.000000000&#x27;, &#x27;1940-01-26T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-27T06:00:00.000000000&#x27;, &#x27;1940-01-27T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-28T06:00:00.000000000&#x27;, &#x27;1940-01-28T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-29T06:00:00.000000000&#x27;, &#x27;1940-01-29T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-30T06:00:00.000000000&#x27;, &#x27;1940-01-30T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-01-31T06:00:00.000000000&#x27;, &#x27;1940-01-31T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-01T06:00:00.000000000&#x27;, &#x27;1940-02-01T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-02T06:00:00.000000000&#x27;, &#x27;1940-02-02T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-03T06:00:00.000000000&#x27;, &#x27;1940-02-03T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-04T06:00:00.000000000&#x27;, &#x27;1940-02-04T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-05T06:00:00.000000000&#x27;, &#x27;1940-02-05T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-06T06:00:00.000000000&#x27;, &#x27;1940-02-06T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-07T06:00:00.000000000&#x27;, &#x27;1940-02-07T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-08T06:00:00.000000000&#x27;, &#x27;1940-02-08T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-09T06:00:00.000000000&#x27;, &#x27;1940-02-09T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-10T06:00:00.000000000&#x27;, &#x27;1940-02-10T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-11T06:00:00.000000000&#x27;, &#x27;1940-02-11T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-12T06:00:00.000000000&#x27;, &#x27;1940-02-12T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-13T06:00:00.000000000&#x27;, &#x27;1940-02-13T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-14T06:00:00.000000000&#x27;, &#x27;1940-02-14T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-15T06:00:00.000000000&#x27;, &#x27;1940-02-15T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-16T06:00:00.000000000&#x27;, &#x27;1940-02-16T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-17T06:00:00.000000000&#x27;, &#x27;1940-02-17T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-18T06:00:00.000000000&#x27;, &#x27;1940-02-18T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-19T06:00:00.000000000&#x27;, &#x27;1940-02-19T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-20T06:00:00.000000000&#x27;, &#x27;1940-02-20T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-21T06:00:00.000000000&#x27;, &#x27;1940-02-21T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-22T06:00:00.000000000&#x27;, &#x27;1940-02-22T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-23T06:00:00.000000000&#x27;, &#x27;1940-02-23T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-24T06:00:00.000000000&#x27;, &#x27;1940-02-24T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-25T06:00:00.000000000&#x27;, &#x27;1940-02-25T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-26T06:00:00.000000000&#x27;, &#x27;1940-02-26T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-27T06:00:00.000000000&#x27;, &#x27;1940-02-27T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-28T06:00:00.000000000&#x27;, &#x27;1940-02-28T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-02-29T06:00:00.000000000&#x27;, &#x27;1940-02-29T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-01T06:00:00.000000000&#x27;, &#x27;1940-03-01T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-02T06:00:00.000000000&#x27;, &#x27;1940-03-02T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-03T06:00:00.000000000&#x27;, &#x27;1940-03-03T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-04T06:00:00.000000000&#x27;, &#x27;1940-03-04T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-05T06:00:00.000000000&#x27;, &#x27;1940-03-05T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-06T06:00:00.000000000&#x27;, &#x27;1940-03-06T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-07T06:00:00.000000000&#x27;, &#x27;1940-03-07T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-08T06:00:00.000000000&#x27;, &#x27;1940-03-08T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-09T06:00:00.000000000&#x27;, &#x27;1940-03-09T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-10T06:00:00.000000000&#x27;, &#x27;1940-03-10T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-11T06:00:00.000000000&#x27;, &#x27;1940-03-11T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-12T06:00:00.000000000&#x27;, &#x27;1940-03-12T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-13T06:00:00.000000000&#x27;, &#x27;1940-03-13T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-14T06:00:00.000000000&#x27;, &#x27;1940-03-14T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-15T06:00:00.000000000&#x27;, &#x27;1940-03-15T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-16T06:00:00.000000000&#x27;, &#x27;1940-03-16T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-17T06:00:00.000000000&#x27;, &#x27;1940-03-17T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-18T06:00:00.000000000&#x27;, &#x27;1940-03-18T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-19T06:00:00.000000000&#x27;, &#x27;1940-03-19T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-20T06:00:00.000000000&#x27;, &#x27;1940-03-20T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-21T06:00:00.000000000&#x27;, &#x27;1940-03-21T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-22T06:00:00.000000000&#x27;, &#x27;1940-03-22T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-23T06:00:00.000000000&#x27;, &#x27;1940-03-23T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-24T06:00:00.000000000&#x27;, &#x27;1940-03-24T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-25T06:00:00.000000000&#x27;, &#x27;1940-03-25T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-26T06:00:00.000000000&#x27;, &#x27;1940-03-26T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-27T06:00:00.000000000&#x27;, &#x27;1940-03-27T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-28T06:00:00.000000000&#x27;, &#x27;1940-03-28T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-29T06:00:00.000000000&#x27;, &#x27;1940-03-29T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-30T06:00:00.000000000&#x27;, &#x27;1940-03-30T18:00:00.000000000&#x27;,\n",
    " &#x27;1940-03-31T06:00:00.000000000&#x27;, &#x27;1940-03-31T18:00:00.000000000&#x27;],\n",
    " dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>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'>1 2 3 4 5 6 7 8 9 10 11 12</div><input id='attrs-678aca9a-a9bd-463e-9b32-b0020e4fc789' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-678aca9a-a9bd-463e-9b32-b0020e4fc789' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a8c79d45-384b-4bcb-b622-875e58adfa25' class='xr-var-data-in' type='checkbox'><label for='data-a8c79d45-384b-4bcb-b622-875e58adfa25' 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>array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype=int32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>latitude</span></div><div class='xr-var-dims'>(latitude)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>90.0 89.75 89.5 ... -89.75 -90.0</div><input id='attrs-20a1f19c-3ee5-40fc-951f-f3d023a53cb7' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-20a1f19c-3ee5-40fc-951f-f3d023a53cb7' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-363c7340-879c-4d8a-aafd-af23d22026fb' class='xr-var-data-in' type='checkbox'><label for='data-363c7340-879c-4d8a-aafd-af23d22026fb' 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>array([ 90. , 89.75, 89.5 , ..., -89.5 , -89.75, -90. ], shape=(721,))</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>longitude</span></div><div class='xr-var-dims'>(longitude)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.0 0.25 0.5 ... 359.2 359.5 359.8</div><input id='attrs-e87c0998-58ee-48d0-8a84-a43075a8540b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-e87c0998-58ee-48d0-8a84-a43075a8540b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e1f7e15a-7ff4-4f8b-97e5-421a03529163' class='xr-var-data-in' type='checkbox'><label for='data-e1f7e15a-7ff4-4f8b-97e5-421a03529163' 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>array([0.0000e+00, 2.5000e-01, 5.0000e-01, ..., 3.5925e+02, 3.5950e+02,\n",
    " 3.5975e+02], shape=(1440,))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-f356edc6-0116-4061-bf64-5be0f41daf36' class='xr-section-summary-in' type='checkbox' checked><label for='section-f356edc6-0116-4061-bf64-5be0f41daf36' class='xr-section-summary' >Data variables: <span>(1)</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'>dask.array&lt;chunksize=(5, 12, 721, 1440), meta=np.ndarray&gt;</div><input id='attrs-5f028af2-d2c7-4cb5-b5d0-518102949c2a' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-5f028af2-d2c7-4cb5-b5d0-518102949c2a' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-7d7d5b05-1d21-4b88-810e-144cd5a1f1a5' class='xr-var-data-in' type='checkbox'><label for='data-7d7d5b05-1d21-4b88-810e-144cd5a1f1a5' 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>minimum_value :</span></dt><dd>-0.001556698465719819</dd><dt><span>maximum_value :</span></dt><dd>0.00033947709016501904</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'><table>\n",
    " <tr>\n",
    " <td>\n",
    " <table style=\"border-collapse: collapse;\">\n",
    " <thead>\n",
    " <tr>\n",
    " <td> </td>\n",
    " <th> Array </th>\n",
    " <th> Chunk </th>\n",
    " </tr>\n",
    " </thead>\n",
    " <tbody>\n",
    " \n",
    " <tr>\n",
    " <th> Bytes </th>\n",
    " <td> 8.45 GiB </td>\n",
    " <td> 237.63 MiB </td>\n",
    " </tr>\n",
    " \n",
    " <tr>\n",
    " <th> Shape </th>\n",
    " <td> (182, 12, 721, 1440) </td>\n",
    " <td> (5, 12, 721, 1440) </td>\n",
    " </tr>\n",
    " <tr>\n",
    " <th> Dask graph </th>\n",
    " <td colspan=\"2\"> 37 chunks in 2 graph layers </td>\n",
    " </tr>\n",
    " <tr>\n",
    " <th> Data type </th>\n",
    " <td colspan=\"2\"> float32 numpy.ndarray </td>\n",
    " </tr>\n",
    " </tbody>\n",
    " </table>\n",
    " </td>\n",
    " <td>\n",
    " <svg width=\"402\" height=\"125\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n",
    "\n",
    " <!-- Horizontal lines -->\n",
    " <line x1=\"0\" y1=\"0\" x2=\"39\" y2=\"0\" style=\"stroke-width:2\" />\n",
    " <line x1=\"0\" y1=\"25\" x2=\"39\" y2=\"25\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Vertical lines -->\n",
    " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n",
    " <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"25\" />\n",
    " <line x1=\"2\" y1=\"0\" x2=\"2\" y2=\"25\" />\n",
    " <line x1=\"3\" y1=\"0\" x2=\"3\" y2=\"25\" />\n",
    " <line x1=\"4\" y1=\"0\" x2=\"4\" y2=\"25\" />\n",
    " <line x1=\"5\" y1=\"0\" x2=\"5\" y2=\"25\" />\n",
    " <line x1=\"6\" y1=\"0\" x2=\"6\" y2=\"25\" />\n",
    " <line x1=\"8\" y1=\"0\" x2=\"8\" y2=\"25\" />\n",
    " <line x1=\"9\" y1=\"0\" x2=\"9\" y2=\"25\" />\n",
    " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"25\" />\n",
    " <line x1=\"12\" y1=\"0\" x2=\"12\" y2=\"25\" />\n",
    " <line x1=\"13\" y1=\"0\" x2=\"13\" y2=\"25\" />\n",
    " <line x1=\"14\" y1=\"0\" x2=\"14\" y2=\"25\" />\n",
    " <line x1=\"16\" y1=\"0\" x2=\"16\" y2=\"25\" />\n",
    " <line x1=\"17\" y1=\"0\" x2=\"17\" y2=\"25\" />\n",
    " <line x1=\"18\" y1=\"0\" x2=\"18\" y2=\"25\" />\n",
    " <line x1=\"19\" y1=\"0\" x2=\"19\" y2=\"25\" />\n",
    " <line x1=\"20\" y1=\"0\" x2=\"20\" y2=\"25\" />\n",
    " <line x1=\"21\" y1=\"0\" x2=\"21\" y2=\"25\" />\n",
    " <line x1=\"22\" y1=\"0\" x2=\"22\" y2=\"25\" />\n",
    " <line x1=\"25\" y1=\"0\" x2=\"25\" y2=\"25\" />\n",
    " <line x1=\"26\" y1=\"0\" x2=\"26\" y2=\"25\" />\n",
    " <line x1=\"27\" y1=\"0\" x2=\"27\" y2=\"25\" />\n",
    " <line x1=\"28\" y1=\"0\" x2=\"28\" y2=\"25\" />\n",
    " <line x1=\"29\" y1=\"0\" x2=\"29\" y2=\"25\" />\n",
    " <line x1=\"30\" y1=\"0\" x2=\"30\" y2=\"25\" />\n",
    " <line x1=\"32\" y1=\"0\" x2=\"32\" y2=\"25\" />\n",
    " <line x1=\"33\" y1=\"0\" x2=\"33\" y2=\"25\" />\n",
    " <line x1=\"35\" y1=\"0\" x2=\"35\" y2=\"25\" />\n",
    " <line x1=\"36\" y1=\"0\" x2=\"36\" y2=\"25\" />\n",
    " <line x1=\"37\" y1=\"0\" x2=\"37\" y2=\"25\" />\n",
    " <line x1=\"38\" y1=\"0\" x2=\"38\" y2=\"25\" />\n",
    " <line x1=\"39\" y1=\"0\" x2=\"39\" y2=\"25\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Colored Rectangle -->\n",
    " <polygon points=\"0.0,0.0 39.851008073325715,0.0 39.851008073325715,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#8B4903A0;stroke-width:0\"/>\n",
    "\n",
    " <!-- Text -->\n",
    " <text x=\"19.925504\" y=\"45.412617\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >182</text>\n",
    " <text x=\"59.851008\" y=\"12.706308\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,59.851008,12.706308)\">1</text>\n",
    "\n",
    "\n",
    " <!-- Horizontal lines -->\n",
    " <line x1=\"109\" y1=\"0\" x2=\"123\" y2=\"14\" style=\"stroke-width:2\" />\n",
    " <line x1=\"109\" y1=\"60\" x2=\"123\" y2=\"75\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Vertical lines -->\n",
    " <line x1=\"109\" y1=\"0\" x2=\"109\" y2=\"60\" style=\"stroke-width:2\" />\n",
    " <line x1=\"123\" y1=\"14\" x2=\"123\" y2=\"75\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Colored Rectangle -->\n",
    " <polygon points=\"109.0,0.0 123.9485979497544,14.948597949754403 123.9485979497544,75.03193128308774 109.0,60.083333333333336\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
    "\n",
    " <!-- Horizontal lines -->\n",
    " <line x1=\"109\" y1=\"0\" x2=\"229\" y2=\"0\" style=\"stroke-width:2\" />\n",
    " <line x1=\"123\" y1=\"14\" x2=\"243\" y2=\"14\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Vertical lines -->\n",
    " <line x1=\"109\" y1=\"0\" x2=\"123\" y2=\"14\" style=\"stroke-width:2\" />\n",
    " <line x1=\"229\" y1=\"0\" x2=\"243\" y2=\"14\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Colored Rectangle -->\n",
    " <polygon points=\"109.0,0.0 229.0,0.0 243.9485979497544,14.948597949754403 123.9485979497544,14.948597949754403\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
    "\n",
    " <!-- Horizontal lines -->\n",
    " <line x1=\"123\" y1=\"14\" x2=\"243\" y2=\"14\" style=\"stroke-width:2\" />\n",
    " <line x1=\"123\" y1=\"75\" x2=\"243\" y2=\"75\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Vertical lines -->\n",
    " <line x1=\"123\" y1=\"14\" x2=\"123\" y2=\"75\" style=\"stroke-width:2\" />\n",
    " <line x1=\"243\" y1=\"14\" x2=\"243\" y2=\"75\" style=\"stroke-width:2\" />\n",
    "\n",
    " <!-- Colored Rectangle -->\n",
    " <polygon points=\"123.9485979497544,14.948597949754403 243.9485979497544,14.948597949754403 243.9485979497544,75.03193128308774 123.9485979497544,75.03193128308774\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
    "\n",
    " <!-- Text -->\n",
    " <text x=\"183.948598\" y=\"95.031931\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >1440</text>\n",
    " <text x=\"263.948598\" y=\"44.990265\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(-90,263.948598,44.990265)\">721</text>\n",
    " <text x=\"106.474299\" y=\"87.557632\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,106.474299,87.557632)\">12</text>\n",
    "</svg>\n",
    " </td>\n",
    " </tr>\n",
    "</table></div></li></ul></div></li><li class='xr-section-item'><input id='section-fb6c2ec4-1ea0-4549-993f-4174468ff0a2' class='xr-section-summary-in' type='checkbox' checked><label for='section-fb6c2ec4-1ea0-4549-993f-4174468ff0a2' 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 r4i0n8 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>Fri Mar 17 12:52:09 MDT 2023</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>Fri Mar 17 12:52:18 2023: ncks -4 --ppc default=7 e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1940030106_1940031606.unc.nc e5.oper.fc.sfc.accumu.128_182_e.ll025sc.1940030106_1940031606.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: 9GB\n",
    "Dimensions: (forecast_initial_time: 182, forecast_hour: 12,\n",
    " latitude: 721, longitude: 1440)\n",
    "Coordinates:\n",
    " * forecast_initial_time (forecast_initial_time) datetime64[ns] 1kB 1940-01...\n",
    " * forecast_hour (forecast_hour) int32 48B 1 2 3 4 5 6 7 8 9 10 11 12\n",
    " * latitude (latitude) float64 6kB 90.0 89.75 ... -89.75 -90.0\n",
    " * longitude (longitude) float64 12kB 0.0 0.25 0.5 ... 359.5 359.8\n",
    "Data variables:\n",
    " E (forecast_initial_time, forecast_hour, latitude, longitude) float32 9GB dask.array<chunksize=(5, 12, 721, 1440), meta=np.ndarray>\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 r4i0n8 4.12.14-95.51-default #1 SMP Fri Apr 1...\n",
    " CONVERSION_DATE: Fri Mar 17 12:52:09 MDT 2023\n",
    " Conventions: CF-1.6\n",
    " NETCDF_COMPRESSION: NCO: Precision-preserving compression to netCDF4/HD...\n",
    " history: Fri Mar 17 12:52:18 2023: ncks -4 --ppc default=7 e...\n",
    " NCO: netCDF Operators version 5.0.3 (Homepage = http://n..."
    ]
    },
    "execution_count": 18,
    "metadata": {},
    "output_type": "execute_result"
    }
    ],
    "source": [
    "credentials = icechunk.containers_credentials(\n",
    " {f\"{data_bucket}/\": icechunk.s3_credentials(anonymous=True)})\n",
    "\n",
    "read_repo = icechunk.Repository.open(\n",
    " storage, config, authorize_virtual_chunk_access=credentials)\n",
    "\n",
    "read_session = read_repo.readonly_session(\"main\")\n",
    "\n",
    "ds = xr.open_zarr(read_session.store, consolidated=False, zarr_format=3, chunks={'forecast_initial_time':5})\n",
    "\n",
    "ds"
    ]
    },
    {
    "cell_type": "code",
    "execution_count": null,
    "id": "06dfd939-9e9a-464b-939f-6ccf79915fe5",
    "metadata": {},
    "outputs": [],
    "source": []
    }
    ],
    "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
    }