{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# 🏃🏼‍♂️ FastHerbie\n", "\n", "Often, data from several GRIB2 files is needed (range of datetimes and/or forecast lead time). `FastHerbie()` use multithreading to help you efficiently create multiple Herbie objects. Then you can download many files using multiprocessing. When you open the data with xarray, it will concatenate the DataSets for a range of model runs and forecast lead times.\n", "\n", "In this example, we will get the F00-F05 forecasts for each of the runs initialized between 00z-06z on January 1, 2022 (a total of 36 Herbie objects).\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from herbie import FastHerbie\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(DatetimeIndex(['2022-03-01 00:00:00', '2022-03-01 01:00:00',\n", " '2022-03-01 02:00:00', '2022-03-01 03:00:00',\n", " '2022-03-01 04:00:00', '2022-03-01 05:00:00'],\n", " dtype='datetime64[ns]', freq='h'),\n", " [0, 1, 2, 3, 4, 5])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a range of dates\n", "DATES = pd.date_range(\n", " start=\"2022-03-01 00:00\",\n", " periods=6,\n", " freq=\"1h\",\n", ")\n", "\n", "# Create a range of forecast lead times\n", "fxx = list(range(0, 6))\n", "\n", "DATES, fxx" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make FastHerbie Object.\n", "FH = FastHerbie(DATES, model=\"hrrr\", fxx=fxx)\n", "FH" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "At it's core, ``FastHerbie`` uses multithreading to make a list of Herbie objects. The list of Herbie objects is stored in the `objects` property." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([\u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 00:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 01:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 02:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 03:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 04:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F01\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F02\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F03\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F04\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m,\n", " \u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m HRRR model \u001b[3msfc\u001b[0m product initialized \u001b[38;2;41;130;13m2022-Mar-01 05:00 UTC\u001b[92m F05\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3msource=aws\u001b[0m],\n", " 36)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FH.objects, len(FH.objects)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "You can download those Herbie objects as full files or subsets." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Download full file\n", "# (commented out because it would take a long time, but you get the idea)\n", "# FH.download()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[PosixPath('/home/blaylock/data/hrrr/20220301/subset_51e4fd54__hrrr.t02z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_514bfd54__hrrr.t02z.wrfsfcf04.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_72effd54__hrrr.t01z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b4effd54__hrrr.t03z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9be4fd54__hrrr.t00z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b4e4fd54__hrrr.t03z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_51effd54__hrrr.t02z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9b21fd54__hrrr.t00z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9b4bfd54__hrrr.t00z.wrfsfcf04.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_7221fd54__hrrr.t01z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5121fd54__hrrr.t02z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_721afd54__hrrr.t01z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_72e4fd54__hrrr.t01z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_511afd54__hrrr.t02z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b421fd54__hrrr.t03z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9b1afd54__hrrr.t00z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_724bfd54__hrrr.t01z.wrfsfcf04.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_7215fd54__hrrr.t01z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b415fd54__hrrr.t03z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b41afd54__hrrr.t03z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9c1afd54__hrrr.t04z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9c21fd54__hrrr.t04z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9c15fd54__hrrr.t04z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9c4bfd54__hrrr.t04z.wrfsfcf04.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9beffd54__hrrr.t00z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9ce4fd54__hrrr.t04z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5eeffd54__hrrr.t05z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5e15fd54__hrrr.t05z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9b15fd54__hrrr.t00z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5115fd54__hrrr.t02z.wrfsfcf03.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5ee4fd54__hrrr.t05z.wrfsfcf01.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_9ceffd54__hrrr.t04z.wrfsfcf00.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5e1afd54__hrrr.t05z.wrfsfcf05.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5e4bfd54__hrrr.t05z.wrfsfcf04.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_5e21fd54__hrrr.t05z.wrfsfcf02.grib2'),\n", " PosixPath('/home/blaylock/data/hrrr/20220301/subset_b44bfd54__hrrr.t03z.wrfsfcf04.grib2')]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download subset\n", "FH.download(\"TMP:2 m\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "You can also read the data with xarray. You'll see here that there are new dimensions for `step` and `time`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/core.py:1257: UserWarning: Will not remove GRIB file because it previously existed.\n", " warnings.warn(\"Will not remove GRIB file because it previously existed.\")\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 305MB\n",
       "Dimensions:              (step: 6, time: 6, y: 1059, x: 1799)\n",
       "Coordinates:\n",
       "  * step                 (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n",
       "  * time                 (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n",
       "    heightAboveGround    float64 8B 2.0\n",
       "    latitude             (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n",
       "    longitude            (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n",
       "    valid_time           (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n",
       "    gribfile_projection  object 8B None\n",
       "Dimensions without coordinates: y, x\n",
       "Data variables:\n",
       "    t2m                  (step, time, y, x) float32 274MB 292.7 292.7 ... 262.5\n",
       "Attributes:\n",
       "    GRIB_edition:            2\n",
       "    GRIB_centre:             kwbc\n",
       "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
       "    GRIB_subCentre:          0\n",
       "    Conventions:             CF-1.7\n",
       "    institution:             US National Weather Service - NCEP\n",
       "    model:                   hrrr\n",
       "    product:                 sfc\n",
       "    description:             High-Resolution Rapid Refresh - CONUS\n",
       "    search:                  TMP:2 m
" ], "text/plain": [ " Size: 305MB\n", "Dimensions: (step: 6, time: 6, y: 1059, x: 1799)\n", "Coordinates:\n", " * step (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n", " * time (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n", " heightAboveGround float64 8B 2.0\n", " latitude (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n", " longitude (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n", " valid_time (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n", " gribfile_projection object 8B None\n", "Dimensions without coordinates: y, x\n", "Data variables:\n", " t2m (step, time, y, x) float32 274MB 292.7 292.7 ... 262.5\n", "Attributes:\n", " GRIB_edition: 2\n", " GRIB_centre: kwbc\n", " GRIB_centreDescription: US National Weather Service - NCEP\n", " GRIB_subCentre: 0\n", " Conventions: CF-1.7\n", " institution: US National Weather Service - NCEP\n", " model: hrrr\n", " product: sfc\n", " description: High-Resolution Rapid Refresh - CONUS\n", " search: TMP:2 m" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds = FH.xarray(\"TMP:2 m\")\n", "ds" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHHCAYAAACRAnNyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb7hJREFUeJzt3Xl4TNf/B/D3ZJssJomQCBUJorGrXVCillhqb6NoiapSiaWqWm0JbQlF8UOjVZIqIZSgqtQWsZVKYytCNIgl9kQikW3O749859bIZJu5MhN5v57nPu2ce+65597MjM+c7SqEEAJEREREJsjM2BUgIiIiKggDFSIiIjJZDFSIiIjIZDFQISIiIpPFQIWIiIhMFgMVIiIiMlkMVIiIiMhkMVAhIiIik8VAhYiIiEyWSQUqM2bMgEKhwL1792Qr09/fHx4eHnofW6FCBdnqUpSoqCgoFAr88ssvpXZOyk+hUGDGjBnGrkap8ff3h0KhgEKhQMOGDWUtu1+/fgaXrflekJPmsxYVFSVruQXx8fGBj49PqZyLIL3nFAoF5s+fb+zqkIFMKlApq9LT0zFjxowiv/SmTJkChUKBQYMGlU7FnqOEhAQEBgbi5Zdfhq2tLWxtbVG/fn0EBATg9OnTxq5emXL//n3MmzcPHTp0gLOzMxwdHdGmTRtERESUqJyVK1eiXr16sLa2Rp06dbBkyZJiH1u5cmX8/PPPmDNnTkmrX6gPP/wQP//8M+rWrStrucX13XffISwsrFh5w8PDsWjRoudaH1MUHR2NPn36wM3NDdbW1nB1dUX37t1x+PBhnfmzsrIwe/Zs1K1bF9bW1qhSpQp69eqF69evF3mu27dvY8SIEXBxcYGNjQ2aNWuGjRs35su3efNmDBo0CLVq1YKtrS28vLzw0UcfITk5udjX1b9/f/z888/o1atXsY8h02Rh7Ao8bytWrIBarX6u50hPT8fMmTMBoMBfTUIIrFu3Dh4eHvj111+RmpoKlUr1XOv1vGzfvh2DBg2ChYUFhg4diiZNmsDMzAwXLlzA5s2bERISgoSEBLi7uxu7qmXC0aNH8fnnn6Nnz5744osvYGFhgU2bNuGtt97CuXPnpPdWYb7//nuMGTMGAwcOxKRJk3Dw4EGMHz8e6enp+OSTT4o83s7ODm+//bYcl6OlY8eOAIAff/xR1pbS4vruu+9QuXJl+Pv7a6V36NABGRkZsLKyktLCw8Nx9uxZTJw4sXQraWQXL16EmZkZxowZA1dXVzx8+BBr1qxBhw4d8Ntvv6F79+5S3uzsbPTq1QtHjhzBqFGj0LhxYzx8+BDHjh1DSkoKqlevXuB5Hj16hPbt2+P27duYMGECXF1dsWHDBvj5+WHt2rUYMmSIlPf9999HtWrV8Pbbb6NGjRo4c+YMli5dih07duDvv/+GjY1NkdfVuHHj5/KeJiMQJiQoKEgAEHfv3jV2VYQQQgwfPlzY2dkVme/u3bsCgAgKCiowz759+wQAsW/fPmFpaSnCwsLy5dm/f78AIDZu3GhItZ+r+Ph4YWdnJ+rVqydu3ryZb392drZYvHixuHbtWqHlpKWlPa8qGqyov6Xc/v33X3HlyhWtNLVaLV577TWhVCqLvFfp6emiUqVKolevXlrpQ4cOFXZ2duLBgweFHj98+HDh7u6uV92Lq2PHjqJBgwZ6Hav5XtBHgwYNRMeOHYuVt1evXs/tPnTs2LHY9TAFjx8/FlWqVBG+vr5a6XPnzhWWlpbi2LFjJS7zm2++EQDE3r17pbTc3FzRsmVL4erqKjIzM6X0/fv35zv+p59+EgDEihUrijxXaX+G6fkyya6f5ORk+Pv7w9HREQ4ODhgxYgTS09Pz5VuzZg2aN28OGxsbODk54a233kJiYqJWHl1jVO7fv4933nkH9vb2cHR0xPDhw3Hq1CkoFAqdzcQ3btxAv379UKFCBTg7O2Py5MnIzc0FAFy5cgXOzs4AgJkzZ0r9os+OcVi7di3q16+PTp06oUuXLli7dm2B15+bm4vPPvsMrq6usLOzQ58+ffJdFwBs3LhRuv7KlSvj7bffxo0bN6T98+fPh0KhwNWrV/MdO3XqVFhZWeHhw4dS2rFjx9C9e3c4ODjA1tYWHTt2zNf8+8033+Dx48cIDQ1F1apV85VrYWGB8ePHw83NTUrTjPW5fPkyevbsCZVKhaFDhwIAHj9+jI8++ghubm5QKpXw8vLC/PnzIZ56qPeVK1cK/Ns8e6814xni4+OLfA9lZmbiww8/hLOzM1QqFfr06VOs5mu51axZM1/rk0KhQL9+/ZCZmYl///230OP379+P+/fvY+zYsVrpAQEBePz4MX777Te966ZQKBAYGIiNGzeifv36sLGxgbe3N86cOQMgryXH09MT1tbW8PHxwZUrV/Q+V0mEhobitddeg4uLC5RKJerXr4+QkBCtPB4eHvjnn39w4MAB6XOpafF8doyKj48PfvvtN1y9elXKq/neCAsLg0KhyHdtBY1z+eGHH1C7dm3Y2NigVatWOHjwoM5ryMzMRFBQEDw9PaFUKuHm5oYpU6YgMzPT0NtjMFtbWzg7O2t1tajVaixevBj9+/dHq1atkJOTo/N7uSAHDx6Es7MzXnvtNSnNzMwMfn5+SEpKwoEDB6R0XS3T/fv3BwCcP3++5BdEZZpJdv34+fmhZs2aCA4Oxt9//40ff/wRLi4umDt3rpRn1qxZmDZtGvz8/PDee+/h7t27WLJkCTp06IDY2Fg4OjrqLFutVqN37944fvw4PvjgA9StWxdbt27F8OHDdebPzc2Fr68vWrdujfnz52PPnj1YsGABateujQ8++ADOzs4ICQnBBx98gP79+2PAgAEA8podNTIzM7Fp0yZ89NFHAIDBgwdjxIgRSEpKgqura75zzpo1CwqFAp988gnu3LmDRYsWoUuXLjh58qTU5BkWFoYRI0agZcuWCA4Oxu3bt7F48WIcPnxYun4/Pz9MmTIFGzZswMcff6x1jg0bNqBbt26oWLEiAGDfvn3o0aMHmjdvjqCgIJiZmUn/GBw8eBCtWrUCkNft4+npidatWxfnTynJycmBr68v2rdvj/nz58PW1hZCCPTp0wf79+/HyJEj8corr2DXrl34+OOPcePGDSxcuLBE53hacd5D7733HtasWYMhQ4agbdu22LdvX4n6s4vblaFSqaBUKkt8DUlJSQDyxo8UJjY2FgDQokULrfTmzZvDzMwMsbGxBjWBHzx4ENu2bUNAQAAAIDg4GK+//jqmTJmC7777DmPHjsXDhw/xzTff4N1338W+ffv0PldxhYSEoEGDBujTpw8sLCzw66+/YuzYsVCr1VI9Fy1ahHHjxqFChQr4/PPPAQBVqlTRWd7nn3+OlJQUXL9+XXrf6TOQfuXKlRg9ejTatm2LiRMn4t9//0WfPn3g5OSkFbyr1Wr06dMHhw4dwvvvv4969erhzJkzWLhwIS5evIgtW7YUep709PRiBQnm5ubSZ7wojx49QlZWFu7du4fVq1fj7Nmz+Oyzz6T9586dw82bN9G4cWO8//77+Omnn5CVlYVGjRph8eLF6NSpU6HlZ2Zm6uyysbW1BQDExMSga9euBR5f3M8DvYCM3aTzNE0T77vvvquV3r9/f1GpUiXp9ZUrV4S5ubmYNWuWVr4zZ84ICwsLrfRnm7U3bdokAIhFixZJabm5ueK1114TAERoaKjWsQDEl19+qXWepk2biubNm0uvi+r6+eWXXwQAcenSJSGEEI8ePRLW1tZi4cKFWvk0XT8vvfSSePTokZS+YcMGAUAsXrxYCCFEVlaWcHFxEQ0bNhQZGRlSvu3btwsAYvr06VKat7e3Vl2FEOL48eMCgFi9erUQIq+boU6dOsLX11eo1WopX3p6uqhZs6bo2rWrEEKIlJQUAUD069cv3zU+fPhQ3L17V9rS09Pz3cdPP/1U65gtW7YIAOLrr7/WSn/jjTeEQqEQ8fHxQgghEhIS8v1tNJ6978V9D508eVIAEGPHjtXKN2TIkGI3GwMo1qar3kW5f/++cHFxEa+++mqReQMCAoS5ubnOfc7OzuKtt94q9PjCun4ACKVSKRISEqS077//XgAQrq6uWu/TqVOnCgBaeTXk7vp5+v2l4evrK2rVqqWVVlDXj+az9nQXQ0FdP6GhoTqv69kyNJ/LV155Rasb44cffhAAtOrx888/CzMzM3Hw4EGtMpcvXy4AiMOHD+erx9M096SorSRdWb6+vtJxVlZWYvTo0VrfL5s3bxYARKVKlUSdOnVEaGioCA0NFXXq1BFWVlbi1KlThZY/btw4YWZmlq+b86233hIARGBgYKHHjxw5Upibm4uLFy8WeS3F/QxT2WCSXT9jxozRev3qq6/i/v37ePToEYC8EeFqtRp+fn64d++etLm6uqJOnTrYv39/gWXv3LkTlpaWGDVqlJRmZmYm/Qorbn2Kao5/2tq1a9GiRQt4enoCyPuF3atXrwK7f4YNG6Y10PaNN95A1apVsWPHDgDAiRMncOfOHYwdOxbW1tZSvl69eqFu3bpaTf2DBg1CTEwMLl++LKVFRERAqVSib9++AICTJ0/i0qVLGDJkCO7fvy/dz8ePH6Nz586Ijo6GWq2W7r+uX5o+Pj5wdnaWtmXLluXL88EHH2i93rFjB8zNzTF+/Hit9I8++ghCCPz+++86709xFPUe0tzLZ89dkoGUu3fvLtbm6+tborqr1WoMHToUycnJxZq58+yg0KdZW1sjIyOjROd/VufOnbW6TzWtaQMHDtR6n2rSS/LZ0NfTv8xTUlJw7949dOzYEf/++y9SUlKe+/l10Xwux4wZo/X38Pf3h4ODg1bejRs3ol69eqhbt67Wd5imW6Sw7zAg7zuiOO+9wrqYnzVnzhz88ccfWLlyJdq0aYOsrCzk5ORI+9PS0gAAqamp2Lt3L/z9/eHv7489e/ZACIFvvvmm0PLfe+89mJubw8/PD0eOHMHly5cRHByMyMhIACj0fRoeHo6VK1fio48+Qp06dYp9TfRiMMmunxo1ami91jRdPnz4EPb29rh06RKEEAW+YS0tLQss++rVq6hatarU3KihCSKeZW1tLY1Bebo+T4/tKExycjJ27NiBwMBAxMfHS+nt2rXDpk2bcPHiRbz88staxzx7XQqFAp6enlIfuWbMiZeXV77z1a1bF4cOHZJev/nmm5g0aRIiIiLw2WefQQiBjRs3okePHrC3twcAXLp0CQAK7P4C8v4x0PyjpPnCetr333+P1NRU3L59W2c3g4WFRb4ZAVevXkW1atXyzX6qV6+e1nXqo6j30NWrV2FmZobatWtr5dN1TwvSpUsXvetXmHHjxmHnzp1YvXo1mjRpUmR+GxsbZGVl6dz35MmTYs2QKMyz91Lzj+7TXRlPpxf3s2GIw4cPIygoCEePHs3XBZKSkpIvMCgNmvfrs59fS0tL1KpVSyvt0qVLOH/+fL7vFo07d+4Ueq5atWrlK9NQr7zyivT/b7/9Npo1awZ/f39pXSfN+6hdu3Zaf/saNWqgffv2OHLkSKHlN27cGOHh4RgzZgzatWsHAHB1dcWiRYvwwQcfFNjVdvDgQYwcORK+vr6YNWuWIZdIZZRJBirm5uY608X/Bliq1WooFAr8/vvvOvPKuUhbQXUpro0bNyIzMxMLFizAggUL8u1fu3Ztsaaf6qtatWp49dVXsWHDBnz22Wf4888/ce3aNa2xGprp2/PmzdP6snpahQoVYGlpiapVq+Ls2bP59mt+TRc0mFKpVMLMTL8GvIIW+9IMaNalqPeQHDR95kVxcHAodrAwc+ZMfPfdd5gzZw7eeeedYh1TtWpV5Obm4s6dO3BxcZHSs7KycP/+fVSrVq1Y5RSkoHtZGvdYl8uXL6Nz586oW7cuvv32W7i5ucHKygo7duzAwoULZV+OQJ/3X1HUajUaNWqEb7/9Vuf+Z4PAZ6Wlpen8wfAsc3PzAoOhwlhZWaFPnz6YM2cOMjIyYGNjI72PdI3zcXFxkcZKFeaNN95Anz59cOrUKeTm5qJZs2bSYORnf7ABwKlTp9CnTx80bNgQv/zyCywsTPKfLHrOyuRfvXbt2hBCoGbNmjrf3IVxd3fH/v37kZ6ertWq8nRrR0kVtmrm2rVr0bBhQwQFBeXb9/333yM8PDxfoKJp4dAQQiA+Pl4aoKuZIRIXF6c1gl6T9uwMkkGDBmHs2LGIi4tDREQEbG1t0bt3b2m/plXB3t6+yFaCXr164ccff8Tx48elAbb6cnd3x549e/KtKXPhwgVpP/Bfa8iziz0Z0uLi7u4OtVqNy5cva7WixMXFFbsMXbOedAkNDc23jocuy5Ytw4wZMzBx4sRirX2ioQkuT5w4gZ49e0rpJ06cgFqtLjD4LKt+/fVXZGZmYtu2bVqtPbq6S0qyom1BeYv7/tO8Xy9duqT1uczOzkZCQoJW61jt2rVx6tQpdO7cWa9Vd+fPn1+sHzju7u56z8TKyMiAEAKpqamwsbFBo0aNYGlpqTWzUOPmzZvFDoisrKzQsmVL6fWePXsA5G+hvHz5Mrp37w4XFxfs2LGjVFcJJ9NikmNUijJgwACYm5tj5syZ+X69CSFw//79Ao/19fVFdnY2VqxYIaWp1WqdYyqKSxPwPPtFlpiYiOjoaPj5+eGNN97It40YMQLx8fE4duyY1nGrV69Gamqq9PqXX37BrVu30KNHDwB5sztcXFywfPlyramMv//+O86fP59v5srAgQNhbm6OdevWYePGjXj99ddhZ2cn7W/evDlq166N+fPn6/yVdvfuXen/p0yZAltbW7z77ru4fft2vrwl+TXds2dP5ObmYunSpVrpCxcuhEKhkK7X3t4elStXRnR0tFa+7777rtjnepam7P/7v//TSi/JyqRyjlGJiIjA+PHjMXTo0AJ/ZQN5sz0uXLigNePotddeg5OTU77puSEhIbC1tX3hVubUtOQ8/V5LSUlBaGhovrx2dnbFXs3Uzs5O5/gWTSD/9PsvNzcXP/zwg1a+Fi1awNnZGcuXL9fqigsLC8tXBz8/P9y4cUPre0gjIyMDjx8/LrSuco5R0dXNlJycjE2bNsHNzU1qpVOpVOjZsyeOHDki/ZgA8qYLHzlyRGvGjq73qS6XLl3C8uXL8frrr2v96ExKSkK3bt1gZmaGXbt26dUqpEt2djYuXLiAW7duaaVfvnxZaxwfANy6dQsXLlxAdna2LOcm/ZXZFpWvv/4aU6dOxZUrV9CvXz+oVCokJCQgMjIS77//PiZPnqzz2H79+qFVq1b46KOPEB8fj7p162Lbtm148OABgJL9AtOwsbFB/fr1ERERgZdffhlOTk5o2LAhfvvtN2kKri49e/aEhYUF1q5dqzXd18nJCe3bt8eIESNw+/ZtLFq0CJ6entIAYEtLS8ydOxcjRoxAx44dMXjwYGl6soeHBz788EOt87i4uKBTp0749ttvkZqamm8JfzMzM/z444/o0aMHGjRogBEjRuCll17CjRs3sH//ftjb2+PXX38FkNf/Hh4ejsGDB8PLy0tamVYIgYSEBISHh8PMzKzQFSo1evfujU6dOuHzzz/HlStX0KRJE/zxxx/YunUrJk6cqDV+5L333sOcOXPw3nvvoUWLFoiOjsbFixeL9wfS4ZVXXsHgwYPx3XffISUlBW3btsXevXtL1LIm1xiV48ePY9iwYahUqRI6d+6c7x+Xtm3bSuMRjh8/jk6dOiEoKEhaP8bGxgZfffUVAgIC8Oabb8LX1xcHDx7EmjVrMGvWLDg5OclST7n5+PjgwIEDJe4q6tatG6ysrNC7d2+MHj0aaWlpWLFiBVxcXPL9A9S8eXOEhITg66+/hqenJ1xcXPK1Qj6dNyIiApMmTULLli1RoUIF9O7dGw0aNECbNm0wdepUPHjwAE5OTli/fr3WQFMg73P59ddfY/To0XjttdcwaNAgJCQkIDQ0NN94knfeeQcbNmzAmDFjsH//frRr1w65ubm4cOECNmzYgF27duWbbv40Oceo9OjRA9WrV0fr1q3h4uKCa9euITQ0FDdv3sz3GIfZs2dj7969eO2116SB6P/3f/8HJycnranMut6nAFC/fn28+eabqFGjBhISEhASEgInJycsX75c6zzdu3fHv//+iylTpuDQoUNa4+6qVKlS6DTmwty4cQP16tXD8OHDtdZl6ty5MwDtruupU6fip59+QkJCgt7PiyOZlPo8o0IUtDJtQdMDN23aJNq3by/s7OyEnZ2dqFu3rggICBBxcXFSHl1TL+/evSuGDBkiVCqVcHBwEP7+/uLw4cMCgFi/fr3WsbpWptU1XfLIkSOiefPmwsrKSpoa16hRI1GjRo1Cr9nHx0e4uLiI7OxsabrjunXrxNSpU4WLi4uwsbERvXr1ElevXs13bEREhGjatKlQKpXCyclJDB06VFy/fl3neVasWCEACJVKpTXl8GmxsbFiwIABolKlSkKpVAp3d3fh5+entZKkRnx8vPjggw+Ep6ensLa2FjY2NqJu3bpizJgx4uTJk1p5C1vhNzU1VXz44YeiWrVqwtLSUtSpU0fMmzdPa5q0EHnTUUeOHCkcHByESqUSfn5+4s6dOwVOTy7OeygjI0OMHz9eVKpUSdjZ2YnevXuLxMTEUp/aqKlbQdvT05s17xFd9fvhhx+El5eXsLKyErVr1xYLFy7Mdx91KWp6ckBAgFaaZrr4vHnztNILW1lZ1/Tk5s2bC1dX1yLrp+vztm3bNtG4cWNhbW0tPDw8xNy5c8WqVavy/Y2TkpJEr169hEql0poirGt6clpamhgyZIhwdHTMN7X38uXLokuXLkKpVIoqVaqIzz77TOzevTtfGUII8d1334maNWsKpVIpWrRoIaKjo3WuTJuVlSXmzp0rGjRoIJRKpahYsaJo3ry5mDlzpkhJSSnyvshl6dKlon379qJy5crCwsJCODs7i969e4vo6Gid+WNiYkSXLl2EnZ2dUKlUom/fvvmmDBf0Pn3rrbeEm5ubsLKyEtWqVRNjxowRt2/fzneOwj4PxVnht6DPiOa9O3z4cK10d3f3fJ8BzbIKuqbbU+lSCPGcR76VEVu2bEH//v1x6NAhaUQ6UXng7++Pffv24e+//4aFhUWBiyXqIzU1FZmZmejbty9SUlKkgdipqalwcnLCokWLCl0agEgfCoUCH3/8MaZMmQI7OzuDZ76RcZXJMSqGena+fm5uLpYsWQJ7e3s0a9bMSLUiMp7ExEQ4Ozujffv2spb7zjvvwNnZOd/U1ejoaLz00kta6xkRyWnevHkFrulEZUu5bFF57733kJGRAW9vb2RmZmLz5s04cuQIZs+ejalTpxq7ekSlSrM0OpA3Db1NmzaylX369GlpsKbcZRMVRDOTCMib9vzsWkBUtpTLQCU8PBwLFixAfHw8njx5Ak9PT3zwwQcIDAw0dtWIiIjoKeUyUCEiIqKyoVyOUSEiIqKygYEKERERmawyueCbhlqtxs2bN6FSqfRaqI2IiMoP8b9HAlSrVk3vZ48Vx5MnTwp8UGhJWFlZwdraWoYalW1lOlC5efNmkQ/vIiIielpiYmKxVs/Wx5MnT1DTvQKS7uj/0EoNV1dXJCQklPtgpUwHKpoH2b301RcwK+d/SIWD4dH7i0BxX2nsKpgMq4dsZQQA1z8zi85UDphHnzR2FYwuB9k4hB1aD0GVW1ZWFpLu5OJqjAfsVfq32jxKVcO9+RVkZWUxUDF2BQyh6e4xs7aGmU35/kMqbDncCAAUjxmoaJgrGagAgIUF7wMAmCssjV0F4/vfHNfSGCpQQaVABZX+51GD71uNMh2oEBERmaJcoUauAYt/5Aq1fJUp4xioEBERyUwNATX0j1QMOfZFw/4CIiIiMllsUSEiIpKZGmoY0nlj2NEvFgYqREREMssVArkGPKHGkGNfNOz6ISIiIpPFFhUiIiKZcTCtfBioEBERyUwNgVwGKrJg1w8RERGZLLaoEBERyYxdP/JhoEJERCQzzvqRD7t+iIiIyGSxRYWIiEhm6v9thhxPeRioEBERySzXwFk/hhz7omGgQkREJLNcAQOfnixfXco6jlEhIiIik8UWFSIiIplxjIp8GKgQERHJTA0FcqEw6HjKw64fIiIiMllsUSEiIpKZWuRthhxPeRioEBERySzXwK4fQ4590bDrh4iIiEwWW1SIiIhkxhYV+TBQISIikplaKKAWBsz6MeDYF41Ru35mzJgBhUKhtdWtW9eYVSIiIiITYvQWlQYNGmDPnj3SawsLo1eJiIjIIOz6kY/RowILCwu4uroauxpERESyyYUZcg3otMiVsS5lndFn/Vy6dAnVqlVDrVq1MHToUFy7dq3AvJmZmXj06JHWRkREZGrE/8ao6LsJjlGRGDVQad26NcLCwrBz506EhIQgISEBr776KlJTU3XmDw4OhoODg7S5ubmVco2JiIioNBk1UOnRowfefPNNNG7cGL6+vtixYweSk5OxYcMGnfmnTp2KlJQUaUtMTCzlGhMRERVNM0bFkI3yGH2MytMcHR3x8ssvIz4+Xud+pVIJpVJZyrUiIiIqmVxhhlxhwBgVLqEvMfoYlaelpaXh8uXLqFq1qrGrQkRERCbAqIHK5MmTceDAAVy5cgVHjhxB//79YW5ujsGDBxuzWkRERAZRQwE1zAzY2PWjYdSun+vXr2Pw4MG4f/8+nJ2d0b59e/z5559wdnY2ZrWIiIgMwnVU5GPUQGX9+vXGPD0RERGZOJMaTEtERPQiMHwwLUfTajBQISIiklneGBUDHkrIrh+JSc36ISIiopILDg5Gy5YtoVKp4OLign79+iEuLk4rT1JSEt555x24urrCzs4OzZo1w6ZNm7Ty9OnTBzVq1IC1tTWqVq2Kd955Bzdv3izNS8mHgQoREZHM1P971o++m7qE/zwfOHAAAQEB+PPPP7F7925kZ2ejW7duePz4sZRn2LBhiIuLw7Zt23DmzBkMGDAAfn5+iI2NlfJ06tQJGzZsQFxcHDZt2oTLly/jjTfekO2+6INdP0RERDIr7TEqO3fu1HodFhYGFxcXxMTEoEOHDgCAI0eOICQkBK1atQIAfPHFF1i4cCFiYmLQtGlTAMCHH34oleHu7o5PP/0U/fr1Q3Z2NiwtLfW+HkOwRYWIiEhmhq2h8l+LyrMP4s3MzCzW+VNSUgAATk5OUlrbtm0RERGBBw8eQK1WY/369Xjy5Al8fHx0lvHgwQOsXbsWbdu2NVqQAjBQISIiMllubm5aD+MNDg4u8hi1Wo2JEyeiXbt2aNiwoZS+YcMGZGdno1KlSlAqlRg9ejQiIyPh6empdfwnn3wCOzs7VKpUCdeuXcPWrVtlv66SYKBCREQks1yhMHgDgMTERK2H8U6dOrXIcwcEBODs2bP51iqbNm0akpOTsWfPHpw4cQKTJk2Cn58fzpw5o5Xv448/RmxsLP744w+Ym5tj2LBhEEacLs0xKkRERDLTDIrV//i8wMDe3h729vbFPi4wMBDbt29HdHQ0qlevLqVfvnwZS5cuxdmzZ9GgQQMAQJMmTXDw4EEsW7YMy5cvl/JWrlwZlStXxssvv4x69erBzc0Nf/75J7y9vfW+HkMwUCEiIirjhBAYN24cIiMjERUVhZo1a2rtT09PBwCYmWkHT+bm5lCr1QWWq9lX3LExzwMDFSIiIpmphRnUBsz6UZewqyUgIADh4eHYunUrVCoVkpKSAAAODg6wsbFB3bp14enpidGjR2P+/PmoVKkStmzZgt27d2P79u0AgGPHjuGvv/5C+/btUbFiRVy+fBnTpk1D7dq1jdaaAnCMChERkewMWUNFn26jkJAQpKSkwMfHB1WrVpW2iIgIAIClpSV27NgBZ2dn9O7dG40bN8bq1avx008/oWfPngAAW1tbbN68GZ07d4aXlxdGjhyJxo0b48CBA1AqlbLfo+JiiwoREVEZV5zBrnXq1Mm3Eu3TGjVqhH379slZLVkwUCEiIpKZGpBm7uh7POVhoEJERCSzpxdt0/d4ysM7QURERCaLLSpEREQyM/xZP2xH0GCgQkREJDM1FFDDkDEq+h/7omGgQkREJDO2qMiHd4KIiIhMFltUiIiIZGb4s37YjqDBQIWIiEhmaqGA2pB1VAw49kXDkI2IiIhMFltUiIiIZKY2sOuHC77958UIVFQ5gE2OsWthVOon5saugklQWHPhaY3MivyiA4C06lbGroJJqFSjurGrYHzqTCCxlE5l8NOT+fnV4J0gIiIik/VitKgQERGZkFwokGvAom2GHPuiYaBCREQkM3b9yId3goiIiEwWW1SIiIhklgvDum9y5atKmcdAhYiISGbs+pEPAxUiIiKZ8aGE8uGdICIiIpPFFhUiIiKZCSigNmCMiuD0ZAkDFSIiIpmx60c+vBNERERkstiiQkREJDO1UEAt9O++MeTYFw0DFSIiIpnlGvj0ZEOOfdHwThAREZHJYosKERGRzNj1Ix8GKkRERDJTwwxqAzotDDn2RcM7QURERCaLLSpEREQyyxUK5BrQfWPIsS8aBipEREQy4xgV+TBQISIikpkw8OnJgivTSngniIiIyGSxRYWIiEhmuVAg14AHCxpy7IuGgQoREZHM1MKwcSZqIWNlyjh2/RAREZHJYosKERGRzNQGDqY15NgXjcnciTlz5kChUGDixInGrgoREZFB1FAYvFEekwhU/vrrL3z//fdo3LixsatCREREJsTogUpaWhqGDh2KFStWoGLFisauDhERkcE0K9MaslEeowcqAQEB6NWrF7p06WLsqhAREclCM0bFkK0kgoOD0bJlS6hUKri4uKBfv36Ii4vTypOUlIR33nkHrq6usLOzQ7NmzbBp0yZp/5UrVzBy5EjUrFkTNjY2qF27NoKCgpCVlSXLPdGXUQfTrl+/Hn///Tf++uuvYuXPzMxEZmam9PrRo0fPq2pERERlxoEDBxAQEICWLVsiJycHn332Gbp164Zz587Bzs4OADBs2DAkJydj27ZtqFy5MsLDw+Hn54cTJ06gadOmuHDhAtRqNb7//nt4enri7NmzGDVqFB4/foz58+cb7dqMFqgkJiZiwoQJ2L17N6ytrYt1THBwMGbOnPmca0ZERGQYNQx81k8JB9Pu3LlT63VYWBhcXFwQExODDh06AACOHDmCkJAQtGrVCgDwxRdfYOHChYiJiUHTpk3R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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot matrix at a single point\n", "a = ds.isel(y=500, x=500)\n", "a[\"step\"] = a[\"step\"].dt.total_seconds() / 3600 # have to convert to hours to plot\n", "a.t2m.plot() # Note: Diagonals are the same valid time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If multiple hypercubes are returned by cfgrib when reading with xarray, then you still get a list of Datasets" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
grib_messagestart_byteend_byterangereference_timevalid_timevariablelevelforecast_timesearch_thisFILE
01576316318193915.07631631-81939152022-03-01 00:00:002022-03-01 00:00:00TMP500 mbanl:TMP:500 mb:anlhttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
1713631834637549890.036318346-375498902022-03-01 00:00:002022-03-01 00:00:00TMP2 m above groundanl:TMP:2 m above ground:anlhttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
21576351858203254.07635185-82032542022-03-01 00:00:002022-03-01 01:00:00TMP500 mb1 hour fcst:TMP:500 mb:1 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
3714358105044810228.043581050-448102282022-03-01 00:00:002022-03-01 01:00:00TMP2 m above ground1 hour fcst:TMP:2 m above ground:1 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
41579621558519233.07962155-85192332022-03-01 00:00:002022-03-01 02:00:00TMP500 mb2 hour fcst:TMP:500 mb:2 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
....................................
67714448943645801367.044489436-458013672022-03-01 05:00:002022-03-01 08:00:00TMP2 m above ground3 hour fcst:TMP:2 m above ground:3 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
681581928818752530.08192881-87525302022-03-01 05:00:002022-03-01 09:00:00TMP500 mb4 hour fcst:TMP:500 mb:4 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
69714468894046005220.044688940-460052202022-03-01 05:00:002022-03-01 09:00:00TMP2 m above ground4 hour fcst:TMP:2 m above ground:4 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
701582857798844677.08285779-88446772022-03-01 05:00:002022-03-01 10:00:00TMP500 mb5 hour fcst:TMP:500 mb:5 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
71714382754545148222.043827545-451482222022-03-01 05:00:002022-03-01 10:00:00TMP2 m above ground5 hour fcst:TMP:2 m above ground:5 hour fcsthttps://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr...
\n", "

72 rows × 11 columns

\n", "
" ], "text/plain": [ " grib_message start_byte end_byte range \\\n", "0 15 7631631 8193915.0 7631631-8193915 \n", "1 71 36318346 37549890.0 36318346-37549890 \n", "2 15 7635185 8203254.0 7635185-8203254 \n", "3 71 43581050 44810228.0 43581050-44810228 \n", "4 15 7962155 8519233.0 7962155-8519233 \n", ".. ... ... ... ... \n", "67 71 44489436 45801367.0 44489436-45801367 \n", "68 15 8192881 8752530.0 8192881-8752530 \n", "69 71 44688940 46005220.0 44688940-46005220 \n", "70 15 8285779 8844677.0 8285779-8844677 \n", "71 71 43827545 45148222.0 43827545-45148222 \n", "\n", " reference_time valid_time variable level \\\n", "0 2022-03-01 00:00:00 2022-03-01 00:00:00 TMP 500 mb \n", "1 2022-03-01 00:00:00 2022-03-01 00:00:00 TMP 2 m above ground \n", "2 2022-03-01 00:00:00 2022-03-01 01:00:00 TMP 500 mb \n", "3 2022-03-01 00:00:00 2022-03-01 01:00:00 TMP 2 m above ground \n", "4 2022-03-01 00:00:00 2022-03-01 02:00:00 TMP 500 mb \n", ".. ... ... ... ... \n", "67 2022-03-01 05:00:00 2022-03-01 08:00:00 TMP 2 m above ground \n", "68 2022-03-01 05:00:00 2022-03-01 09:00:00 TMP 500 mb \n", "69 2022-03-01 05:00:00 2022-03-01 09:00:00 TMP 2 m above ground \n", "70 2022-03-01 05:00:00 2022-03-01 10:00:00 TMP 500 mb \n", "71 2022-03-01 05:00:00 2022-03-01 10:00:00 TMP 2 m above ground \n", "\n", " forecast_time search_this \\\n", "0 anl :TMP:500 mb:anl \n", "1 anl :TMP:2 m above ground:anl \n", "2 1 hour fcst :TMP:500 mb:1 hour fcst \n", "3 1 hour fcst :TMP:2 m above ground:1 hour fcst \n", "4 2 hour fcst :TMP:500 mb:2 hour fcst \n", ".. ... ... \n", "67 3 hour fcst :TMP:2 m above ground:3 hour fcst \n", "68 4 hour fcst :TMP:500 mb:4 hour fcst \n", "69 4 hour fcst :TMP:2 m above ground:4 hour fcst \n", "70 5 hour fcst :TMP:500 mb:5 hour fcst \n", "71 5 hour fcst :TMP:2 m above ground:5 hour fcst \n", "\n", " FILE \n", "0 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "1 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "2 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "3 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "4 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", ".. ... \n", "67 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "68 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "69 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "70 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "71 https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrr... \n", "\n", "[72 rows x 11 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FH.inventory(\"TMP:(?:[8,5]00 mb|2 m)\")\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n", "/home/blaylock/GITHUB/Herbie/src/herbie/fast.py:347: FutureWarning: In a future version of xarray the default value for coords will change from coords='different' to coords='minimal'. This is likely to lead to different results when multiple datasets have matching variables with overlapping values. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set coords explicitly.\n", " ds = xr.combine_nested(\n" ] }, { "data": { "text/plain": [ "2" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds = FH.xarray(\"TMP:(?:[8,5]00 mb|2 m)\", remove_grib=False)\n", "len(ds)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 305MB\n",
       "Dimensions:              (step: 6, time: 6, y: 1059, x: 1799)\n",
       "Coordinates:\n",
       "  * step                 (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n",
       "  * time                 (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n",
       "    heightAboveGround    float64 8B 2.0\n",
       "    latitude             (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n",
       "    longitude            (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n",
       "    valid_time           (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n",
       "    gribfile_projection  object 8B None\n",
       "Dimensions without coordinates: y, x\n",
       "Data variables:\n",
       "    t2m                  (step, time, y, x) float32 274MB 292.7 292.7 ... 262.5\n",
       "Attributes:\n",
       "    GRIB_edition:            2\n",
       "    GRIB_centre:             kwbc\n",
       "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
       "    GRIB_subCentre:          0\n",
       "    Conventions:             CF-1.7\n",
       "    institution:             US National Weather Service - NCEP\n",
       "    model:                   hrrr\n",
       "    product:                 sfc\n",
       "    description:             High-Resolution Rapid Refresh - CONUS\n",
       "    search:                  TMP:(?:[8,5]00 mb|2 m)
" ], "text/plain": [ " Size: 305MB\n", "Dimensions: (step: 6, time: 6, y: 1059, x: 1799)\n", "Coordinates:\n", " * step (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n", " * time (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n", " heightAboveGround float64 8B 2.0\n", " latitude (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n", " longitude (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n", " valid_time (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n", " gribfile_projection object 8B None\n", "Dimensions without coordinates: y, x\n", "Data variables:\n", " t2m (step, time, y, x) float32 274MB 292.7 292.7 ... 262.5\n", "Attributes:\n", " GRIB_edition: 2\n", " GRIB_centre: kwbc\n", " GRIB_centreDescription: US National Weather Service - NCEP\n", " GRIB_subCentre: 0\n", " Conventions: CF-1.7\n", " institution: US National Weather Service - NCEP\n", " model: hrrr\n", " product: sfc\n", " description: High-Resolution Rapid Refresh - CONUS\n", " search: TMP:(?:[8,5]00 mb|2 m)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds[0]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 305MB\n",
       "Dimensions:              (step: 6, time: 6, y: 1059, x: 1799)\n",
       "Coordinates:\n",
       "  * step                 (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n",
       "  * time                 (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n",
       "    isobaricInhPa        float64 8B 500.0\n",
       "    latitude             (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n",
       "    longitude            (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n",
       "    valid_time           (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n",
       "    gribfile_projection  object 8B None\n",
       "Dimensions without coordinates: y, x\n",
       "Data variables:\n",
       "    t                    (step, time, y, x) float32 274MB 262.7 262.7 ... 238.5\n",
       "Attributes:\n",
       "    GRIB_edition:            2\n",
       "    GRIB_centre:             kwbc\n",
       "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
       "    GRIB_subCentre:          0\n",
       "    Conventions:             CF-1.7\n",
       "    institution:             US National Weather Service - NCEP\n",
       "    model:                   hrrr\n",
       "    product:                 sfc\n",
       "    description:             High-Resolution Rapid Refresh - CONUS\n",
       "    search:                  TMP:(?:[8,5]00 mb|2 m)
" ], "text/plain": [ " Size: 305MB\n", "Dimensions: (step: 6, time: 6, y: 1059, x: 1799)\n", "Coordinates:\n", " * step (step) timedelta64[ns] 48B 00:00:00 ... 05:00:00\n", " * time (time) datetime64[ns] 48B 2022-03-01 ... 2022-03-01T...\n", " isobaricInhPa float64 8B 500.0\n", " latitude (y, x) float64 15MB 21.14 21.15 21.15 ... 47.85 47.84\n", " longitude (y, x) float64 15MB 237.3 237.3 237.3 ... 299.0 299.1\n", " valid_time (step, time) datetime64[ns] 288B 2022-03-01 ... 2022...\n", " gribfile_projection object 8B None\n", "Dimensions without coordinates: y, x\n", "Data variables:\n", " t (step, time, y, x) float32 274MB 262.7 262.7 ... 238.5\n", "Attributes:\n", " GRIB_edition: 2\n", " GRIB_centre: kwbc\n", " GRIB_centreDescription: US National Weather Service - NCEP\n", " GRIB_subCentre: 0\n", " Conventions: CF-1.7\n", " institution: US National Weather Service - NCEP\n", " model: hrrr\n", " product: sfc\n", " description: High-Resolution Rapid Refresh - CONUS\n", " search: TMP:(?:[8,5]00 mb|2 m)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "herbie-data", "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.9" } }, "nbformat": 4, "nbformat_minor": 2 }