diff --git a/notebooks/excarta_temp_proc_analysis.ipynb b/notebooks/excarta_temp_proc_analysis.ipynb
new file mode 100644
index 0000000..6072560
--- /dev/null
+++ b/notebooks/excarta_temp_proc_analysis.ipynb
@@ -0,0 +1,2271 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "ce9a1598",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# import libs\n",
+ "import xarray as xr\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import datetime\n",
+ "import os\n",
+ "import pathlib as Path\n",
+ "from datetime import datetime\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d5c494a4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# sort the data into the correct format\n",
+ "def data_loader(folder_path):\n",
+ " \n",
+ " column_names = ['DateTimeUTC', 'LocationId', 'Latitude', 'Longitude', 'dni', 'dhi', 'ghi']\n",
+ " \n",
+ " files = os.listdir(folder_path)\n",
+ " \n",
+ " dfs = []\n",
+ " \n",
+ " for filename in files:\n",
+ " if filename.endswith(\".csv\") and not filename.startswith(\"._\"):\n",
+ " file_path = os.path.join(folder_path, filename)\n",
+ " print(file_path)\n",
+ " print(filename)\n",
+ " df = pd.read_csv(file_path, header=None, names=column_names, parse_dates=['DateTimeUTC'])\n",
+ " \n",
+ " # Remove the .csv\n",
+ " datetime_str = filename[:-4] \n",
+ " # Convert the filename to a datetime object\n",
+ " datetime_obj = datetime.strptime(datetime_str, \"%Y%m%d%H\")\n",
+ "\n",
+ " df['step'] = (df['DateTimeUTC'] - datetime_obj).dt.total_seconds() / 3600 # convert timedelta to hours\n",
+ " \n",
+ " df['init_time'] = datetime_obj\n",
+ " \n",
+ " dfs.append(df)\n",
+ " \n",
+ " \n",
+ " return dfs\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "231ff600",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def load_data_from_all_years(parent_folder_path):\n",
+ " # Initialize an empty list to store the dataframes\n",
+ " all_dataframes = []\n",
+ "\n",
+ " # Loop over each year's folder and call the folder_data_load_sorted function\n",
+ " for year in range(2018, 2019):\n",
+ " folder_path = os.path.join(parent_folder_path, str(year))\n",
+ " dataframes = data_loader(folder_path)\n",
+ " all_dataframes.extend(dataframes)\n",
+ "\n",
+ " return all_dataframes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e283f859",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def pdtocdf(dfs):\n",
+ " \n",
+ " merged_df = pd.concat(dfs, ignore_index=True)\n",
+ " \n",
+ " ds = xr.Dataset.from_dataframe(merged_df)\n",
+ " \n",
+ " ds = ds.set_index(index=['init_time', 'step','Latitude','Longitude']).unstack('index')\n",
+ " \n",
+ " \n",
+ "# ds = ds.assign_coords(latitude=ds[\"Latitude\"])\n",
+ "# ds = ds.assign_coords(longitude=ds[\"Longitude\"])\n",
+ " \n",
+ "# ds = ds.drop(\"Latitude\")\n",
+ "# ds = ds.drop(\"Longitude\")\n",
+ " \n",
+ " \n",
+ " ds = ds.drop_vars([\"LocationId\", \"DateTimeUTC\"])\n",
+ " \n",
+ " var_names = ds.data_vars\n",
+ " d2 = xr.concat([ds[v] for v in var_names], dim=\"variable\")\n",
+ "\n",
+ " # Set the coordinates to keep the names of the variables.\n",
+ " d2 = d2.assign_coords(variable=(\"variable\", var_names))\n",
+ "\n",
+ " # Turn the xr.DataArray into a xr.Dataset.\n",
+ " ds = xr.Dataset(dict(value=d2))\n",
+ "\n",
+ " #When datesets are merged the steps can be out of order, so we sort them\n",
+ " ds = ds.sortby('step')\n",
+ " ds = ds.sortby('init_time')\n",
+ "\n",
+ " \n",
+ "# ds = ds.rename({\"UtcDatetime\": \"ts\", \"SiteId\": \"pv_id\"})\n",
+ " \n",
+ "# ds = ds.drop_vars([\"Unnamed: 0\", \"PostCode\"])\n",
+ "# ds = ds.rename({\"UtcDatetime\": \"ts\", \"SiteId\": \"pv_id\"})\n",
+ " ds = ds.rename({\"Latitude\": \"latitude\", \"Longitude\": \"longitude\"})\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " # Convert 'step' and 'ts' variables to dimensions\n",
+ " # Drop the 'dim_0' dimension\n",
+ "# ds = ds.set_coords(\"ts\").swap_dims({\"dim_0\": \"ts\"})\n",
+ "\n",
+ "# ds = ds.drop(\"dim_0\")\n",
+ "\n",
+ "# # Set 'step' and 'ts' as dimensions\n",
+ "# ds = ds.set_coords('step')\n",
+ " \n",
+ "# ds = ds.set_coords('Latitude')\n",
+ "# ds = ds.set_coords('Longitude')\n",
+ " \n",
+ " return ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2ae411d6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def main():\n",
+ " PATH = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data\"\n",
+ " dfs = load_data_from_all_years(PATH)\n",
+ " ds = pdtocdf(dfs)\n",
+ "# ds.to_zarr('excarta_SI.nc')\n",
+ " return ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8c8de7bb",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "ds = main()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f0e118d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9afbd533",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dfs = data_loader(\"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data/2021\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c04a005f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dfs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c6cea281",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# root_dir = Path(\"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/solar_radiation_UK_Malta_17_23_1calcperday/solar_data\")\n",
+ "PATH = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data\"\n",
+ "\n",
+ "YEARS = [2018,2019,2020,2021,2022]\n",
+ "column_names = ['DateTimeUTC', 'LocationId', 'Latitude', 'Longitude', 'dni', 'dhi', 'ghi']\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "14d832c3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "NWP_PATH = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/clients/island/nwp_v8.zarr\"\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "534abcb7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the data as an xarray dataset\n",
+ "dataset = xr.open_dataset(NWP_PATH)\n",
+ "dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f06d18d5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Low memory script\n",
+ "import os\n",
+ "from datetime import datetime\n",
+ "import pandas as pd\n",
+ "import xarray as xr\n",
+ "import argparse\n",
+ "import pathlib\n",
+ "\n",
+ "\n",
+ "# def _parse_args():\n",
+ "# parser = argparse.ArgumentParser()\n",
+ "# parser.add_argument(\"output\", type=pathlib.Path, help=\"Output zarr file\")\n",
+ "# return parser.parse_args()\n",
+ "\n",
+ "\n",
+ "def data_loader(folder_path):\n",
+ " \"\"\"\n",
+ " Loads and transforms data from CSV files in the given folder_path and directly convert each DataFrame into an xarray Dataset.\n",
+ " \"\"\"\n",
+ " column_names = ['DateTimeUTC', 'LocationId', 'Latitude', 'Longitude', 'dni', 'dhi', 'ghi']\n",
+ " files = os.listdir(folder_path)\n",
+ " datasets = []\n",
+ "\n",
+ " for filename in files:\n",
+ " if filename.endswith(\".csv\") and not filename.startswith(\"._\"):\n",
+ " file_path = os.path.join(folder_path, filename)\n",
+ "\n",
+ " df = pd.read_csv(file_path, header=None, names=column_names, parse_dates=['DateTimeUTC'])\n",
+ " datetime_str = filename[:-4]\n",
+ " datetime_obj = datetime.strptime(datetime_str, \"%Y%m%d%H\")\n",
+ " df['step'] = (df['DateTimeUTC'] - datetime_obj).dt.total_seconds() / 3600 # convert timedelta to hours\n",
+ " df['init_time'] = datetime_obj\n",
+ "\n",
+ " # Convert the dataframe to an xarray Dataset and append to the list\n",
+ " ds = xr.Dataset.from_dataframe(df)\n",
+ " ds = ds.drop_vars([\"LocationId\", \"DateTimeUTC\"])\n",
+ " datasets.append(ds)\n",
+ "\n",
+ " return datasets\n",
+ "\n",
+ "\n",
+ "def load_data_from_all_years(parent_folder_path):\n",
+ " all_datasets = []\n",
+ "\n",
+ " for year in range(2026, 2027):\n",
+ " folder_path = os.path.join(parent_folder_path, str(year))\n",
+ " datasets = data_loader(folder_path)\n",
+ " all_datasets.extend(datasets)\n",
+ "\n",
+ " return all_datasets\n",
+ "\n",
+ "\n",
+ "def pdtocdf(datasets):\n",
+ " \"\"\"\n",
+ " Processes the xarray Datasets and merges them.\n",
+ " \"\"\"\n",
+ " print(datasets)\n",
+ "# ds = xr.merge(datasets)\n",
+ "\n",
+ "# ds = ds.set_index(index=['init_time', 'step', 'Latitude', 'Longitude']).unstack('index')\n",
+ " # Step 1: Set 'init_time', 'step', 'latitude', and 'longitude' as a multi-index\n",
+ " datasets = [ds.set_index(index=['init_time', 'step', 'Latitude', 'Longitude']) for ds in datasets]\n",
+ "\n",
+ " # Step 2: Concatenate all Datasets along the new multi-index\n",
+ " ds = xr.concat(datasets, dim='index')\n",
+ " \n",
+ " var_names = ds.data_vars\n",
+ " d2 = xr.concat([ds[v] for v in var_names], dim=\"variable\")\n",
+ " d2 = d2.assign_coords(variable=(\"variable\", var_names))\n",
+ " ds = xr.Dataset(dict(value=d2))\n",
+ " ds = ds.sortby('step')\n",
+ " ds = ds.sortby('init_time')\n",
+ " ds = ds.sortby('Latitude')\n",
+ " ds = ds.sortby('Longitude')\n",
+ " ds = ds.rename({\"Latitude\": \"y\", \"Longitude\": \"x\"})\n",
+ "\n",
+ " return ds\n",
+ "\n",
+ "\n",
+ "def main():\n",
+ "# # args = _parse_args()\n",
+ "\n",
+ "# if args.output.exists():\n",
+ "# raise RuntimeError(f'Output file \"{args.output}\" already exist')\n",
+ "\n",
+ " PATH = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data\"\n",
+ " datasets = load_data_from_all_years(PATH)\n",
+ " ds = pdtocdf(datasets)\n",
+ "# ds.to_zarr(args.output)\n",
+ " \n",
+ " return ds\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bb63507e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds = main()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d9801e9e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "552c437b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "ds= unstacked_ds\n",
+ "\n",
+ "# Select the data for a given init_time, x, and y\n",
+ "selected_data = ds['value'].sel(variable='dhi', init_time='2019-09-27T00', x=13.250000, y=35.250000)#,method='nearest')\n",
+ "\n",
+ "# Create a plot\n",
+ "plt.figure(figsize=(10, 6))\n",
+ "selected_data.plot.line('o-')\n",
+ "plt.title('dhi vs step')\n",
+ "plt.xlabel('step')\n",
+ "plt.ylabel('dhi')\n",
+ "plt.grid(True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cb3bd109",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(selected_data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fb5d8a46",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unstacked_ds = ds.unstack('index')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0e054268",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unstacked_ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d80b5056",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "ds= combined_ds\n",
+ "\n",
+ "# Select the data for a given init_time, x, and y\n",
+ "selected_data = ds['value'].sel(variable='dhi', init_time='2019-09-27T00', x=13.250000, y=35.250000)#,method='nearest')\n",
+ "\n",
+ "# Create a plot\n",
+ "plt.figure(figsize=(10, 6))\n",
+ "selected_data.plot.line('o-')\n",
+ "plt.title('dhi vs step')\n",
+ "plt.xlabel('step')\n",
+ "plt.ylabel('dhi')\n",
+ "plt.grid(True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "55c99753",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Drop all records that have a NaN value in the 'value' variable\n",
+ "combined_ds = unstacked_ds.dropna(dim='variable', subset=['value'])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6263d208",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "combined_ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "42a3a421",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unstacked_ds.to_zarr('/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/a1_2018_only.zarr')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "36eb98de",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#read\n",
+ "path_2017 = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/b1_2017_only_t2.zarr\"\n",
+ "dataset_2017 = xr.open_zarr(path_2017)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e6021055",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dataset_2017"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "da155339",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# I could load this data into my nwp dashboard to explore the data\n",
+ "import matplotlib.pyplot as plt\n",
+ "import xarray as xr\n",
+ "\n",
+ "data = dataset_2017\n",
+ "\n",
+ "# Assuming your dataset is named 'data'\n",
+ "# Selecting a specific variable, init_time, and step\n",
+ "selected_data = data.sel(variable='ghi', init_time='2017-12-31T00', step=1)\n",
+ "\n",
+ "# Accessing the values\n",
+ "values = selected_data['value']\n",
+ "\n",
+ "values\n",
+ "# Plotting the values\n",
+ "# plt.imshow(values, origin='lower')\n",
+ "# plt.colorbar(label='Value')\n",
+ "# plt.title('Plot of GHI')\n",
+ "# plt.xlabel('x')\n",
+ "# plt.ylabel('y')\n",
+ "# plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fb2df18c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assuming your dataset is named 'data'\n",
+ "# Selecting a specific latitude and longitude\n",
+ "latitude = 49\n",
+ "longitude = -8\n",
+ "\n",
+ "\n",
+ "selected_data = data.sel(x=longitude, y=latitude,method='nearest')\n",
+ "\n",
+ "# Selecting the specific variable\n",
+ "variable = 'dni'\n",
+ "selected_variable_data = selected_data.sel(variable=variable, init_time='2017-12-31T06')\n",
+ "\n",
+ "# Accessing the values and step dimensions\n",
+ "values = selected_variable_data['value'].values\n",
+ "steps = selected_variable_data['step']\n",
+ "\n",
+ "print(\"---\")\n",
+ "print(values)\n",
+ "print(\"---\")\n",
+ "print(steps)\n",
+ "# Plotting the line chart\n",
+ "plt.plot(values, steps)\n",
+ "plt.title(f'Line Chart of {variable.upper()} at Latitude: {latitude}, Longitude: {longitude}')\n",
+ "plt.xlabel('Step')\n",
+ "plt.ylabel(variable.upper())\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "57cd69e7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Tsting monthly data\n",
+ "\n",
+ "ds = xr.load_dataset(\"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/r2201802.zarr\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d0252137",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a8f099d7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Select the data for a given init_time, x, and y\n",
+ "selected_data = ds['value'].sel(variable='dhi', init_time='2018-02-01T00', x=13.250000, y=35.250000)#,method='nearest')\n",
+ "\n",
+ "# Create a plot\n",
+ "plt.figure(figsize=(10, 6))\n",
+ "selected_data.plot.line('o-')\n",
+ "plt.title('dhi vs step')\n",
+ "plt.xlabel('step')\n",
+ "plt.ylabel('dhi')\n",
+ "plt.grid(True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f27cefdb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "695c48bd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import xarray as xr\n",
+ "import os\n",
+ "\n",
+ "def merge_zarr_files(zarr_path, merged_zarr_path):\n",
+ " # Collect paths of Zarr files in the specified directory\n",
+ " zarr_files = [os.path.join(zarr_path, file) for file in os.listdir(zarr_path) if file.endswith('.zarr')]\n",
+ "\n",
+ " print(\"1\")\n",
+ " # Open the first Zarr file to create the initial dataset\n",
+ " merged_ds = xr.open_zarr(zarr_files[0])\n",
+ " \n",
+ " print(\"2\")\n",
+ "\n",
+ " # Iterate over the remaining Zarr files and merge them into the initial dataset\n",
+ " for file in zarr_files[1:]:\n",
+ " ds = xr.open_zarr(file)\n",
+ " merged_ds = merged_ds.combine_first(ds)\n",
+ " \n",
+ " print(\"3\")\n",
+ "\n",
+ " # Rechunk the merged dataset\n",
+ " merged_ds = merged_ds.chunk(chunks={\"init_time\": 10, \"x\": 100, \"y\": 100})\n",
+ " \n",
+ " print(\"4\")\n",
+ " \n",
+ " # Define the specific range of x and y coordinates\n",
+ " x_range = (-10, 2) # Example x coordinate range\n",
+ " y_range = (49, 59) # Example y coordinate range\n",
+ "\n",
+ " filtered_dataset = merged_ds.sel(x=slice(*x_range), y=slice(*y_range))\n",
+ " \n",
+ " print(filtered_dataset)\n",
+ "\n",
+ " # Save the merged dataset as a new Zarr file\n",
+ " filtered_dataset.to_zarr(merged_zarr_path)\n",
+ " \n",
+ " print(\"5\")\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "# Specify the path where the independent Zarr files are located\n",
+ "zarr_path = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/r3_test_merge\"\n",
+ "\n",
+ "# Specify the path for the merged Zarr file\n",
+ "merged_zarr_path = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/merged_excarta/merged_3_r3_test_merge_ukfilt_t2.zarr\"\n",
+ "\n",
+ "# Merge the Zarr files\n",
+ "merge_zarr_files(zarr_path, merged_zarr_path)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "id": "d250308d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "
<xarray.Dataset>\n",
+ "Dimensions: (init_time: 124, step: 168, variable: 3, y: 122, x: 122)\n",
+ "Coordinates:\n",
+ " * init_time (init_time) datetime64[ns] 2022-05-01 ... 2022-05-31T18:00:00\n",
+ " * step (step) float64 1.0 2.0 3.0 4.0 5.0 ... 165.0 166.0 167.0 168.0\n",
+ " * variable (variable) <U3 'dni' 'dhi' 'ghi'\n",
+ " * x (x) float64 -9.879 -9.758 -9.636 -9.515 ... 14.83 14.92 15.0\n",
+ " * y (y) float64 35.0 35.08 35.17 35.25 35.33 ... 58.7 58.8 58.9 59.0\n",
+ "Data variables:\n",
+ " value (variable, init_time, step, y, x) float64 dask.array<chunksize=(1, 16, 42, 31, 31), meta=np.ndarray>
- init_time: 124
- step: 168
- variable: 3
- y: 122
- x: 122
init_time
(init_time)
datetime64[ns]
2022-05-01 ... 2022-05-31T18:00:00
array(['2022-05-01T00:00:00.000000000', '2022-05-01T06:00:00.000000000',\n",
+ " '2022-05-01T12:00:00.000000000', '2022-05-01T18:00:00.000000000',\n",
+ " '2022-05-02T00:00:00.000000000', '2022-05-02T06:00:00.000000000',\n",
+ " '2022-05-02T12:00:00.000000000', '2022-05-02T18:00:00.000000000',\n",
+ " '2022-05-03T00:00:00.000000000', '2022-05-03T06:00:00.000000000',\n",
+ " '2022-05-03T12:00:00.000000000', '2022-05-03T18:00:00.000000000',\n",
+ " '2022-05-04T00:00:00.000000000', '2022-05-04T06:00:00.000000000',\n",
+ " '2022-05-04T12:00:00.000000000', '2022-05-04T18:00:00.000000000',\n",
+ " '2022-05-05T00:00:00.000000000', '2022-05-05T06:00:00.000000000',\n",
+ " '2022-05-05T12:00:00.000000000', '2022-05-05T18:00:00.000000000',\n",
+ " '2022-05-06T00:00:00.000000000', '2022-05-06T06:00:00.000000000',\n",
+ " '2022-05-06T12:00:00.000000000', '2022-05-06T18:00:00.000000000',\n",
+ " '2022-05-07T00:00:00.000000000', '2022-05-07T06:00:00.000000000',\n",
+ " '2022-05-07T12:00:00.000000000', '2022-05-07T18:00:00.000000000',\n",
+ " '2022-05-08T00:00:00.000000000', '2022-05-08T06:00:00.000000000',\n",
+ " '2022-05-08T12:00:00.000000000', '2022-05-08T18:00:00.000000000',\n",
+ " '2022-05-09T00:00:00.000000000', '2022-05-09T06:00:00.000000000',\n",
+ " '2022-05-09T12:00:00.000000000', '2022-05-09T18:00:00.000000000',\n",
+ " '2022-05-10T00:00:00.000000000', '2022-05-10T06:00:00.000000000',\n",
+ " '2022-05-10T12:00:00.000000000', '2022-05-10T18:00:00.000000000',\n",
+ " '2022-05-11T00:00:00.000000000', '2022-05-11T06:00:00.000000000',\n",
+ " '2022-05-11T12:00:00.000000000', '2022-05-11T18:00:00.000000000',\n",
+ " '2022-05-12T00:00:00.000000000', '2022-05-12T06:00:00.000000000',\n",
+ " '2022-05-12T12:00:00.000000000', '2022-05-12T18:00:00.000000000',\n",
+ " '2022-05-13T00:00:00.000000000', '2022-05-13T06:00:00.000000000',\n",
+ " '2022-05-13T12:00:00.000000000', '2022-05-13T18:00:00.000000000',\n",
+ " '2022-05-14T00:00:00.000000000', '2022-05-14T06:00:00.000000000',\n",
+ " '2022-05-14T12:00:00.000000000', '2022-05-14T18:00:00.000000000',\n",
+ " '2022-05-15T00:00:00.000000000', '2022-05-15T06:00:00.000000000',\n",
+ " '2022-05-15T12:00:00.000000000', '2022-05-15T18:00:00.000000000',\n",
+ " '2022-05-16T00:00:00.000000000', '2022-05-16T06:00:00.000000000',\n",
+ " '2022-05-16T12:00:00.000000000', '2022-05-16T18:00:00.000000000',\n",
+ " '2022-05-17T00:00:00.000000000', '2022-05-17T06:00:00.000000000',\n",
+ " '2022-05-17T12:00:00.000000000', '2022-05-17T18:00:00.000000000',\n",
+ " '2022-05-18T00:00:00.000000000', '2022-05-18T06:00:00.000000000',\n",
+ " '2022-05-18T12:00:00.000000000', '2022-05-18T18:00:00.000000000',\n",
+ " '2022-05-19T00:00:00.000000000', '2022-05-19T06:00:00.000000000',\n",
+ " '2022-05-19T12:00:00.000000000', '2022-05-19T18:00:00.000000000',\n",
+ " '2022-05-20T00:00:00.000000000', '2022-05-20T06:00:00.000000000',\n",
+ " '2022-05-20T12:00:00.000000000', '2022-05-20T18:00:00.000000000',\n",
+ " '2022-05-21T00:00:00.000000000', '2022-05-21T06:00:00.000000000',\n",
+ " '2022-05-21T12:00:00.000000000', '2022-05-21T18:00:00.000000000',\n",
+ " '2022-05-22T00:00:00.000000000', '2022-05-22T06:00:00.000000000',\n",
+ " '2022-05-22T12:00:00.000000000', '2022-05-22T18:00:00.000000000',\n",
+ " '2022-05-23T00:00:00.000000000', '2022-05-23T06:00:00.000000000',\n",
+ " '2022-05-23T12:00:00.000000000', '2022-05-23T18:00:00.000000000',\n",
+ " '2022-05-24T00:00:00.000000000', '2022-05-24T06:00:00.000000000',\n",
+ " '2022-05-24T12:00:00.000000000', '2022-05-24T18:00:00.000000000',\n",
+ " '2022-05-25T00:00:00.000000000', '2022-05-25T06:00:00.000000000',\n",
+ " '2022-05-25T12:00:00.000000000', '2022-05-25T18:00:00.000000000',\n",
+ " '2022-05-26T00:00:00.000000000', '2022-05-26T06:00:00.000000000',\n",
+ " '2022-05-26T12:00:00.000000000', '2022-05-26T18:00:00.000000000',\n",
+ " '2022-05-27T00:00:00.000000000', '2022-05-27T06:00:00.000000000',\n",
+ " '2022-05-27T12:00:00.000000000', '2022-05-27T18:00:00.000000000',\n",
+ " '2022-05-28T00:00:00.000000000', '2022-05-28T06:00:00.000000000',\n",
+ " '2022-05-28T12:00:00.000000000', '2022-05-28T18:00:00.000000000',\n",
+ " '2022-05-29T00:00:00.000000000', '2022-05-29T06:00:00.000000000',\n",
+ " '2022-05-29T12:00:00.000000000', '2022-05-29T18:00:00.000000000',\n",
+ " '2022-05-30T00:00:00.000000000', '2022-05-30T06:00:00.000000000',\n",
+ " '2022-05-30T12:00:00.000000000', '2022-05-30T18:00:00.000000000',\n",
+ " '2022-05-31T00:00:00.000000000', '2022-05-31T06:00:00.000000000',\n",
+ " '2022-05-31T12:00:00.000000000', '2022-05-31T18:00:00.000000000'],\n",
+ " dtype='datetime64[ns]')
step
(step)
float64
1.0 2.0 3.0 ... 166.0 167.0 168.0
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,\n",
+ " 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,\n",
+ " 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36.,\n",
+ " 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48.,\n",
+ " 49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60.,\n",
+ " 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72.,\n",
+ " 73., 74., 75., 76., 77., 78., 79., 80., 81., 82., 83., 84.,\n",
+ " 85., 86., 87., 88., 89., 90., 91., 92., 93., 94., 95., 96.,\n",
+ " 97., 98., 99., 100., 101., 102., 103., 104., 105., 106., 107., 108.,\n",
+ " 109., 110., 111., 112., 113., 114., 115., 116., 117., 118., 119., 120.,\n",
+ " 121., 122., 123., 124., 125., 126., 127., 128., 129., 130., 131., 132.,\n",
+ " 133., 134., 135., 136., 137., 138., 139., 140., 141., 142., 143., 144.,\n",
+ " 145., 146., 147., 148., 149., 150., 151., 152., 153., 154., 155., 156.,\n",
+ " 157., 158., 159., 160., 161., 162., 163., 164., 165., 166., 167., 168.])
variable
(variable)
<U3
'dni' 'dhi' 'ghi'
array(['dni', 'dhi', 'ghi'], dtype='<U3')
x
(x)
float64
-9.879 -9.758 -9.636 ... 14.92 15.0
array([-9.878788, -9.757576, -9.636364, -9.515152, -9.393939, -9.272727,\n",
+ " -9.151515, -9.030303, -8.909091, -8.787879, -8.666667, -8.545455,\n",
+ " -8.424242, -8.30303 , -8.181818, -8.060606, -7.939394, -7.818182,\n",
+ " -7.69697 , -7.575758, -7.454545, -7.333333, -7.212121, -7.090909,\n",
+ " -6.969697, -6.848485, -6.727273, -6.606061, -6.484848, -6.363636,\n",
+ " -6.242424, -6.121212, -6. , -5.878788, -5.757576, -5.636364,\n",
+ " -5.515152, -5.393939, -5.272727, -5.151515, -5.030303, -4.909091,\n",
+ " -4.787879, -4.666667, -4.545455, -4.424242, -4.30303 , -4.181818,\n",
+ " -4.060606, -3.939394, -3.818182, -3.69697 , -3.575758, -3.454545,\n",
+ " -3.333333, -3.212121, -3.090909, -2.969697, -2.848485, -2.727273,\n",
+ " -2.606061, -2.484848, -2.363636, -2.242424, -2.121212, -2. ,\n",
+ " -1.878788, -1.757576, -1.636364, -1.515152, -1.393939, -1.272727,\n",
+ " -1.151515, -1.030303, -0.909091, -0.787879, -0.666667, -0.545455,\n",
+ " -0.424242, -0.30303 , 0.060606, 0.181818, 0.30303 , 0.424242,\n",
+ " 0.545455, 0.666667, 0.787879, 0.909091, 1.030303, 1.151515,\n",
+ " 1.272727, 1.393939, 1.515152, 1.636364, 1.757576, 1.878788,\n",
+ " 2. , 13. , 13.083333, 13.166667, 13.25 , 13.333333,\n",
+ " 13.416667, 13.5 , 13.583333, 13.666667, 13.75 , 13.833333,\n",
+ " 13.916667, 14. , 14.083333, 14.166667, 14.25 , 14.333333,\n",
+ " 14.416667, 14.5 , 14.583333, 14.666667, 14.75 , 14.833333,\n",
+ " 14.916667, 15. ])
y
(y)
float64
35.0 35.08 35.17 ... 58.8 58.9 59.0
array([35. , 35.083333, 35.166667, 35.25 , 35.333333, 35.416667,\n",
+ " 35.5 , 35.583333, 35.666667, 35.75 , 35.833333, 35.916667,\n",
+ " 36. , 36.083333, 36.166667, 36.25 , 36.333333, 36.416667,\n",
+ " 36.5 , 36.583333, 36.666667, 36.75 , 36.833333, 36.916667,\n",
+ " 37. , 49.10101 , 49.20202 , 49.30303 , 49.40404 , 49.505051,\n",
+ " 49.606061, 49.707071, 49.808081, 49.909091, 50.010101, 50.111111,\n",
+ " 50.212121, 50.313131, 50.414141, 50.515152, 50.616162, 50.717172,\n",
+ " 50.818182, 50.919192, 51.020202, 51.121212, 51.222222, 51.323232,\n",
+ " 51.424242, 51.525253, 51.626263, 51.727273, 51.828283, 51.929293,\n",
+ " 52.030303, 52.131313, 52.232323, 52.333333, 52.434343, 52.535354,\n",
+ " 52.636364, 52.737374, 52.838384, 52.939394, 53.040404, 53.141414,\n",
+ " 53.242424, 53.343434, 53.444444, 53.545455, 53.646465, 53.747475,\n",
+ " 53.848485, 53.949495, 54.050505, 54.151515, 54.252525, 54.353535,\n",
+ " 54.454545, 54.555556, 54.656566, 54.757576, 54.858586, 54.959596,\n",
+ " 55.060606, 55.161616, 55.262626, 55.363636, 55.464646, 55.565657,\n",
+ " 55.666667, 55.767677, 55.868687, 55.969697, 56.070707, 56.171717,\n",
+ " 56.272727, 56.373737, 56.474747, 56.575758, 56.676768, 56.777778,\n",
+ " 56.878788, 56.979798, 57.080808, 57.383838, 57.484848, 57.585859,\n",
+ " 57.686869, 57.787879, 57.888889, 57.989899, 58.090909, 58.191919,\n",
+ " 58.292929, 58.393939, 58.494949, 58.59596 , 58.69697 , 58.79798 ,\n",
+ " 58.89899 , 59. ])
value
(variable, init_time, step, y, x)
float64
dask.array<chunksize=(1, 16, 42, 31, 31), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | Bytes | \n",
+ " 6.93 GiB | \n",
+ " 4.93 MiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | Shape | \n",
+ " (3, 124, 168, 122, 122) | \n",
+ " (1, 16, 42, 31, 31) | \n",
+ " \n",
+ " \n",
+ " | Dask graph | \n",
+ " 1536 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " | Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
PandasIndex
PandasIndex(DatetimeIndex(['2022-05-01 00:00:00', '2022-05-01 06:00:00',\n",
+ " '2022-05-01 12:00:00', '2022-05-01 18:00:00',\n",
+ " '2022-05-02 00:00:00', '2022-05-02 06:00:00',\n",
+ " '2022-05-02 12:00:00', '2022-05-02 18:00:00',\n",
+ " '2022-05-03 00:00:00', '2022-05-03 06:00:00',\n",
+ " ...\n",
+ " '2022-05-29 12:00:00', '2022-05-29 18:00:00',\n",
+ " '2022-05-30 00:00:00', '2022-05-30 06:00:00',\n",
+ " '2022-05-30 12:00:00', '2022-05-30 18:00:00',\n",
+ " '2022-05-31 00:00:00', '2022-05-31 06:00:00',\n",
+ " '2022-05-31 12:00:00', '2022-05-31 18:00:00'],\n",
+ " dtype='datetime64[ns]', name='init_time', length=124, freq=None))
PandasIndex
PandasIndex(Float64Index([ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,\n",
+ " 10.0,\n",
+ " ...\n",
+ " 159.0, 160.0, 161.0, 162.0, 163.0, 164.0, 165.0, 166.0, 167.0,\n",
+ " 168.0],\n",
+ " dtype='float64', name='step', length=168))
PandasIndex
PandasIndex(Index(['dni', 'dhi', 'ghi'], dtype='object', name='variable'))
PandasIndex
PandasIndex(Float64Index([-9.878788, -9.757576, -9.636364, -9.515152, -9.393939, -9.272727,\n",
+ " -9.151515, -9.030303, -8.909091, -8.787879,\n",
+ " ...\n",
+ " 14.25, 14.333333, 14.416667, 14.5, 14.583333, 14.666667,\n",
+ " 14.75, 14.833333, 14.916667, 15.0],\n",
+ " dtype='float64', name='x', length=122))
PandasIndex
PandasIndex(Float64Index([ 35.0, 35.083333, 35.166667, 35.25, 35.333333, 35.416667,\n",
+ " 35.5, 35.583333, 35.666667, 35.75,\n",
+ " ...\n",
+ " 58.090909, 58.191919, 58.292929, 58.393939, 58.494949, 58.59596,\n",
+ " 58.69697, 58.79798, 58.89899, 59.0],\n",
+ " dtype='float64', name='y', length=122))
"
+ ],
+ "text/plain": [
+ "\n",
+ "Dimensions: (init_time: 124, step: 168, variable: 3, y: 122, x: 122)\n",
+ "Coordinates:\n",
+ " * init_time (init_time) datetime64[ns] 2022-05-01 ... 2022-05-31T18:00:00\n",
+ " * step (step) float64 1.0 2.0 3.0 4.0 5.0 ... 165.0 166.0 167.0 168.0\n",
+ " * variable (variable) "
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "\n",
+ "# path_zarr_test = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/r4/Malta/full_v2_201801.zarr\"\n",
+ "\n",
+ "path_zarr_test = \"/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/r3/full_v1_202205.zarr\"\n",
+ "ds = xr.open_zarr(path_zarr_test)\n",
+ "\n",
+ "ds\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "id": "acd344fc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "7441.528036\n"
+ ]
+ }
+ ],
+ "source": [
+ "print((ds.nbytes)/1000000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "id": "a9ed2e1d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "True\n",
+ "False\n",
+ "True\n",
+ "False\n",
+ "True\n",
+ "False\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/tmp/ipykernel_2050364/1594016849.py:2: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
+ " print('2018-01-04T06:00:00.000000000' in ds['value'].coords['init_time'].values)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('dhi' in ds['value'].coords['variable'].values)\n",
+ "print('2018-01-04T06:00:00.000000000' in ds['value'].coords['init_time'].values)\n",
+ "\n",
+ "print(np.all(np.diff(ds.coords['x']) > 0)) # For ascending. Output should be True.\n",
+ "print(np.all(np.diff(ds.coords['x']) < 0)) # For descending. Output should be True.\n",
+ "\n",
+ "print(np.all(np.diff(ds.coords['y']) > 0)) # For ascending. Output should be True.\n",
+ "print(np.all(np.diff(ds.coords['y']) < 0)) # For descending. Output should be True.\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "id": "0811c9dd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['2022-05-01T00:00:00.000000000' '2022-05-01T06:00:00.000000000'\n",
+ " '2022-05-01T12:00:00.000000000' '2022-05-01T18:00:00.000000000'\n",
+ " '2022-05-02T00:00:00.000000000' '2022-05-02T06:00:00.000000000'\n",
+ " '2022-05-02T12:00:00.000000000' '2022-05-02T18:00:00.000000000'\n",
+ " '2022-05-03T00:00:00.000000000' '2022-05-03T06:00:00.000000000'\n",
+ " '2022-05-03T12:00:00.000000000' '2022-05-03T18:00:00.000000000'\n",
+ " '2022-05-04T00:00:00.000000000' '2022-05-04T06:00:00.000000000'\n",
+ " '2022-05-04T12:00:00.000000000' '2022-05-04T18:00:00.000000000'\n",
+ " '2022-05-05T00:00:00.000000000' '2022-05-05T06:00:00.000000000'\n",
+ " '2022-05-05T12:00:00.000000000' '2022-05-05T18:00:00.000000000'\n",
+ " '2022-05-06T00:00:00.000000000' '2022-05-06T06:00:00.000000000'\n",
+ " '2022-05-06T12:00:00.000000000' '2022-05-06T18:00:00.000000000'\n",
+ " '2022-05-07T00:00:00.000000000' '2022-05-07T06:00:00.000000000'\n",
+ " '2022-05-07T12:00:00.000000000' '2022-05-07T18:00:00.000000000'\n",
+ " '2022-05-08T00:00:00.000000000' '2022-05-08T06:00:00.000000000'\n",
+ " '2022-05-08T12:00:00.000000000' '2022-05-08T18:00:00.000000000'\n",
+ " '2022-05-09T00:00:00.000000000' '2022-05-09T06:00:00.000000000'\n",
+ " '2022-05-09T12:00:00.000000000' '2022-05-09T18:00:00.000000000'\n",
+ " '2022-05-10T00:00:00.000000000' '2022-05-10T06:00:00.000000000'\n",
+ " '2022-05-10T12:00:00.000000000' '2022-05-10T18:00:00.000000000'\n",
+ " '2022-05-11T00:00:00.000000000' '2022-05-11T06:00:00.000000000'\n",
+ " '2022-05-11T12:00:00.000000000' '2022-05-11T18:00:00.000000000'\n",
+ " '2022-05-12T00:00:00.000000000' '2022-05-12T06:00:00.000000000'\n",
+ " '2022-05-12T12:00:00.000000000' '2022-05-12T18:00:00.000000000'\n",
+ " '2022-05-13T00:00:00.000000000' '2022-05-13T06:00:00.000000000'\n",
+ " '2022-05-13T12:00:00.000000000' '2022-05-13T18:00:00.000000000'\n",
+ " '2022-05-14T00:00:00.000000000' '2022-05-14T06:00:00.000000000'\n",
+ " '2022-05-14T12:00:00.000000000' '2022-05-14T18:00:00.000000000'\n",
+ " '2022-05-15T00:00:00.000000000' '2022-05-15T06:00:00.000000000'\n",
+ " '2022-05-15T12:00:00.000000000' '2022-05-15T18:00:00.000000000'\n",
+ " '2022-05-16T00:00:00.000000000' '2022-05-16T06:00:00.000000000'\n",
+ " '2022-05-16T12:00:00.000000000' '2022-05-16T18:00:00.000000000'\n",
+ " '2022-05-17T00:00:00.000000000' '2022-05-17T06:00:00.000000000'\n",
+ " '2022-05-17T12:00:00.000000000' '2022-05-17T18:00:00.000000000'\n",
+ " '2022-05-18T00:00:00.000000000' '2022-05-18T06:00:00.000000000'\n",
+ " '2022-05-18T12:00:00.000000000' '2022-05-18T18:00:00.000000000'\n",
+ " '2022-05-19T00:00:00.000000000' '2022-05-19T06:00:00.000000000'\n",
+ " '2022-05-19T12:00:00.000000000' '2022-05-19T18:00:00.000000000'\n",
+ " '2022-05-20T00:00:00.000000000' '2022-05-20T06:00:00.000000000'\n",
+ " '2022-05-20T12:00:00.000000000' '2022-05-20T18:00:00.000000000'\n",
+ " '2022-05-21T00:00:00.000000000' '2022-05-21T06:00:00.000000000'\n",
+ " '2022-05-21T12:00:00.000000000' '2022-05-21T18:00:00.000000000'\n",
+ " '2022-05-22T00:00:00.000000000' '2022-05-22T06:00:00.000000000'\n",
+ " '2022-05-22T12:00:00.000000000' '2022-05-22T18:00:00.000000000'\n",
+ " '2022-05-23T00:00:00.000000000' '2022-05-23T06:00:00.000000000'\n",
+ " '2022-05-23T12:00:00.000000000' '2022-05-23T18:00:00.000000000'\n",
+ " '2022-05-24T00:00:00.000000000' '2022-05-24T06:00:00.000000000'\n",
+ " '2022-05-24T12:00:00.000000000' '2022-05-24T18:00:00.000000000'\n",
+ " '2022-05-25T00:00:00.000000000' '2022-05-25T06:00:00.000000000'\n",
+ " '2022-05-25T12:00:00.000000000' '2022-05-25T18:00:00.000000000'\n",
+ " '2022-05-26T00:00:00.000000000' '2022-05-26T06:00:00.000000000'\n",
+ " '2022-05-26T12:00:00.000000000' '2022-05-26T18:00:00.000000000'\n",
+ " '2022-05-27T00:00:00.000000000' '2022-05-27T06:00:00.000000000'\n",
+ " '2022-05-27T12:00:00.000000000' '2022-05-27T18:00:00.000000000'\n",
+ " '2022-05-28T00:00:00.000000000' '2022-05-28T06:00:00.000000000'\n",
+ " '2022-05-28T12:00:00.000000000' '2022-05-28T18:00:00.000000000'\n",
+ " '2022-05-29T00:00:00.000000000' '2022-05-29T06:00:00.000000000'\n",
+ " '2022-05-29T12:00:00.000000000' '2022-05-29T18:00:00.000000000'\n",
+ " '2022-05-30T00:00:00.000000000' '2022-05-30T06:00:00.000000000'\n",
+ " '2022-05-30T12:00:00.000000000' '2022-05-30T18:00:00.000000000'\n",
+ " '2022-05-31T00:00:00.000000000' '2022-05-31T06:00:00.000000000'\n",
+ " '2022-05-31T12:00:00.000000000' '2022-05-31T18:00:00.000000000']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(ds['value'].coords['init_time'].values)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 121,
+ "id": "1e1abd14",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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H33ETjjhBGa329mgQYPYM888E/XhwCd0b7zxBhs5ciSz2WxsxIgR7H//+1/YdvHcTP7yl78wAGzPnj0R7/3hD39gVqtVfQBu376d/fSnP2W9evVidrud9enTh1166aWsrq6uw/Pq7HMAIv6FOl379+9n11xzDSsuLlbP9bnnnov47gCwV155hd1+++2sV69eLD09nc2aNYvt27evw/F1BAA2f/589W9ujx07drCrrrqK5eTksOzsbHb11Vez5ubmsM8OGDBAPQ9ui/b/YjldV111VdTtOxvXtm3b2BVXXMGys7NZYWEhu+OOO5jP52P79u1j5513HsvKymK9evViDz/8cMQxnU4nu+uuu9jgwYOZzWZjffv2Zb///e+Z0+kM2+7w4cNs69atEecbL2+99RYDELZKt2jRIgaAbd68OWzbl19+mQHoNKrw7bffMgDs8ccf7/T4c+fOZQBYQ0NDp9uedNJJ7KSTTop4ffr06Wzw4MFhr/HrsqWlhbW2tna6747oyNF65513GAD2zjvvhL3+xRdfMABhUapQOpq0/f73v2dmsznMIWGMsfvvv58BUK+h+vp6ZrFY2O9///uw7VwuF8vMzGTXXntt2Otbt25le/fuDXst3u+0K+fZ3NzMtm7dGuZYd2Ws8Z5/LJJxTrTP+K67eIn2LHW73eyee+5hgwYNYjabjQ0YMIDdfvvtEfe8AQMGsHPOOYd9+umn7KSTTmJ2u50NHDiQ/fOf/4w4zsaNG9npp5/OHA4H69OnD7v33nvZ888/H/EsrqurY1u3bu3w+dlVR4sxxs4991zWq1evTre7+OKLWa9evVSnjnP99dez9PR09TvYvHkzA8AWLVoUtt2BAwcYAHbvvffqYp9dIdrc6M0332QzZ85kpaWlzGazsUGDBrF77rlHXeRjzB9tbP9MDnW69u7dG+Z8dEQ0O3FHy+PxRNyLOkNGO4kG1WjpnG+++Qbl5eWoqanBggULcO211+Kee+6JWbf02Wef4Ze//CUuu+wyPPTQQ3A6nbjwwgtRU1PTpeNecsklUBQF//rXvyLe+9e//oXp06cjLy8PbW1tOPvss7FmzRrccsstWLRoEa6//nr88MMPqKuri7n/eD734osvwm6347TTTsOLL76IF198Eb/4xS8AANXV1Tj55JPx/vvv4+abb8bf/vY3DBkyBNdee23UPOk///nPeOeddzBv3jz86le/wsqVKzF16lS0trZ26XvpjEsuuQSNjY144IEHcMkll2DJkiVYsGBBzO1PP/10/OpXvwIA/PGPf1TPc/jw4VG3/8UvfoFp06YBgLrtiy++2Om4Lr30Uvh8Pjz44IOYMGEC7rvvPjz22GOYNm0a+vTpg4ULF2LIkCH43e9+h1WrVqmf8/l8OO+88/Dwww9j1qxZeOKJJ3DBBRfg0UcfxaWXXhp2jCeffBLDhw/HunXrOh1PNKqqqgAAhYWF6mvffPMNMjIyIr6P8ePHq+93dZ8dbZueno709PQOt/P5fPj2229x4oknRrw3fvx47Nq1C42NjWGvL1myBBkZGUhLS8OIESPw8ssvdzqersK/i/bjOuGEE2AymTr9rmLt87jjjkN2dnbY6/z737BhAwDgu+++g8fjiTi2zWbDmDFjIo49fPhwXHnllerfXflOu3Ke69atw/Dhw/Hkk0+qr3VlrPGefzSScU60z65dd93l5z//Oe666y6MGzcOjz76KM444ww88MADuOyyyyK23blzJy666CJMmzYNjzzyCPLy8nD11Vdj8+bN6jYHDhzAlClTsHnzZtx+++249dZb8dJLL+Fvf/tbxP7eeOMNDB8+HG+88UaPzqG5uRlHjhzBrl278Oijj+J///sfzjrrrE4/980332DcuHEwmcKnh+PHj0dLSwu2b9+ubgdE2q13797o27dvxHWk1T57ypIlS5CZmYm5c+fib3/7G0444QTcdddd+MMf/qBu86c//QljxoxBYWGh+kwOnYdceeWVMZ/p8dqppaUF2dnZyMnJQX5+Pm666aa46l+NYic9Y9F6AETHzJ8/H2azGZ9//jl69+4NwD+Zj3XRbt26FVu2bMHgwYMBAFOmTMHo0aOxbNmyuBQJOf3798fJJ5+MV199Fb///e/V17/88kv88MMPqhjDli1bsHv3brz22mu46KKL1O3uuuuuDvcfz+fmzJmDG264AYMGDcKcOXPCPv+nP/0JXq8X3333HQoKCgAAN9xwA2bPno27774bv/jFL5CWlqZuX1tbi61btyIrKwsAMG7cOFxyySVYvHix6ugkgrFjx+K5555T/66pqcFzzz2HhQsXRt1+0KBBOO200/D4449j2rRpMQucORMnTsRxxx2HlStXRnwnHTF+/Hj8/e9/BwBcf/31OOaYY/Db3/4WDzzwAObNmwcAmD17Nnr37o3nn38ep59+OgB/ge/777+PTz75BJMmTVL3V1ZWhhtuuAFffPEFTjnllLjHEYu2tjY89thjGDhwIE466ST19crKSvTq1StCAKK0tBQAcPDgwQ73+9BDDyE7OxszZszocLudO3fi9ddfx8UXXwyz2dzhtrW1tXC5XOoYYo1r6NChAIBTTjkFl1xyCQYOHIiDBw9i0aJFuOKKK1BfX48bb7yxw2N1hcrKSpjNZhQXF4e9brPZUFBQ0Ol3FWufnZ0n3y709fbbfvrppx0epyvfaU/Psytjjff8U3VOtM/4r7vusnHjRvzzn//Ez3/+cyxevBgA8Mtf/hLFxcV4+OGH8dFHH2HKlCnq9tu2bcOqVatw2mmnAfA/n/v164cXXngBDz/8MABg4cKFOHr0KNavX48xY8YAAK655hoce+yxPRprR/z2t79V7/kmkwk//elPwxYcYlFZWane/0MJ/Y6PP/74Tq+j0GtDy332lJdffjlsLnHDDTfghhtuwFNPPYX77rsPdrtdXbA8evRol57LQHx2Ki0txW233YZx48bB5/OhoqICTz31FDZu3IiPP/4YFkvsqbxR7KRnKKKlY7xeL95//31ccMEFqpMFAEOGDIk5cZw6darqZAHAqFGjkJ2d3S1VpksvvRRff/01du3apb726quvwm634/zzzwcA5OTkAADeffddtLS0xL3v7n4OABhj+M9//oNZs2aBMYYjR46o/84++2zU19dHKNpceeWVqpMFABdddBFKS0uxYsWKLh27M2644Yawv0877TTU1NSgoaEhocfpKj//+c/V/zabzTjxxBPBGMO1116rvp6bm4uhQ4eG/VZee+01DB8+HMOGDQv7ns8880wAwEcffaRue/fdd4Mx1qmzGI2bb74ZW7ZswZNPPhn20GhtbYXdbo/Y3uFwqO/H4v7778f777+PBx98ELm5uTG3a2lpwcUXX4y0tLS4lAD5MeMd1+eff45f//rXOO+883DDDTfg66+/RllZGf74xz8mNKLa2toKm80W9T2Hw9GtY8X7/Xf2nbQ/NmMMH3/8cdhxOvp8+2PFe56TJ08GYyxMpbMrY+3J7y8Z50T7jP+66y78mTB37tyw13/7298CAN55552w10eMGKE6WQBQVFQUcR+tqKjAxIkTVScLAPLz83HFFVdEHP/q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Xmtra2Pjxo1jaWlprLGxUX394MGDbOvWraytrU197ZVXXmFo1/fo8OHDLDc3l1166aVh+x02bBgbPXp02H34jjvuYIqisC1btuhmn/HS/nnNW458/PHH6jYul4uNGTMmog3LpZdeynJzc6PuN9q9IV47tba2Rm058vvf/54BYK+//nrY57du3coOHjwYtq1sdhINcrR0zldffcVsNhs75phj2MKFC9n999/PevfurV7ooSTD0WKMsalTp7KsrCwGgP3nP/8Je++NN95gffr0Yb/5zW/YU089xR5//HF20kknMavVylavXh1zn/F+bubMmSwjI4M98sgjbNmyZWzNmjWMMX8T1wEDBrD09HT261//mv39739nDzzwALv44otZXl6e+nnuaB1//PFs1KhR7NFHH2V/+MMfmMPhYEOGDAlzCvi2oY5KLBLpaFVWVjKz2cxOPvlktmTJErZs2bKoN2EOdxL/3//7f2zp0qVs2bJlXR5XvI6W1+tlM2fOZIqisMsuu4w98cQT7LHHHmM33HADy8/PD5vw8GN11nh5z549LCcnh6WlpbFFixZFdLvfuHFj2Pb8gXL99dezxYsXs3POOYcBYC+99JK6TUNDA+vXrx8zmUzswQcfjNjnF198oW77+uuvMwDs2GOPjdjuxRdfZFVVVR2Onx9v8ODBrLi4mD300EPs0UcfZf369WO9e/cOc67mz5/PRo8eze644w727LPPsgULFrABAwYwRVHY0qVLOz0O/77uvfdedu+997IJEyaofUruvfde9n//939h2/K+YxdddBFbvHgxu/LKKxkA9uc//znm/jvryXPxxRerfaf+/ve/s1NOOYVZLBb2ySefhG339ddfM7vdzsaOHcuefvpp9qc//Yk5HA42ffr0iH0CiDhmvN9pV84z1jXdlbHGe/68l06yz4n2Gd8+o9kjGtH6aPF+hZdccglbtGiR+vcFF1wQtl28jta+fftYbm4uKywsZAsWLGAPP/wwGzZsmPocD+1XyZ8ZL7zwQtg+P/nkE/W6Ly4uZsccc4z6d+hv8YILLmBnnnkmu/vuu9nixYvZvffey4YNG8YAsEceeSTqeYY+nzweDzv55JNZZmYmW7BgAVu0aBEbOXIky8rKYt9//33Y55cvX84URWFnnnkme/bZZ9mvfvUrZjKZ2HXXXRe2ndb7jHae0Wj/vD5y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ffv2Rd++fZGQkAC3242ysrKg942Ojjb+nJubi7q6Opw4caJHPw8REcmHM1pERKScsLAwFBYW4vPPP8cnn3yCFStW4Le//S2Ki4s7fH1dXR3GjBmDd955p93P+vfv39PFJSIiBbGjRUREStI0DePHj8f48ePx1FNPITMzE+vWrYPT6YTX6w167ejRo/Hee+8hOTkZsbGxnb7n3r17cfHiRURFRQEAdu7cib59+yIjI6NHPwsREcmHSweJiEg5xcXFeP755/Hll1/i+PHjWLt2Lc6ePYvhw4dj8ODB2LdvH0pLS3Hu3Dl4PB7MnDkTSUlJmDp1Knbs2IEjR45g69atePTRR3Hy5EnjfZuamjB37lwcOHAAGzZswJIlS7BgwQLuzyIionY4o0VERMqJjY3F9u3b8corr6CmpgaZmZl46aWXMGXKFIwdOxZbt27F2LFjUVdXhy1btuCWW27B9u3bsWjRIkybNg21tbUYMGAAJkyYEDTDNWHCBFx99dW4+eab0djYiBkzZuDpp5+27oMSEZFtaUIIYXUhiIiI7G727NmoqqrC+++/b3VRiIhIAlzrQEREREREZDJ2tIiIiIiIiEzGpYNEREREREQm44wWERERERGRydjRIiIiIiIiMhk7WkRERERERCZjR4uIiIiIiMhk7GgRERERERGZjB0tIiIiIiIik7GjRUREREREZDJ2tIiIiIiIiEz2/wH0zdKQQC8jqAAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Select the data for a given init_time, x, and y\n",
+ "selected_data = ds['value'].sel(variable='dhi', init_time='2022-05-10T00:00:00.000000000')\n",
+ "\n",
+ "selected_data_2 = selected_data.sel(x=13.000000, y=35.000000 , method='nearest')\n",
+ "\n",
+ "selected_data_2.values\n",
+ "\n",
+ "# x=14.666667, y=35.166667\n",
+ "# x=13.250000, y=35.250000\n",
+ "\n",
+ "# Create a plot\n",
+ "plt.figure(figsize=(10, 6))\n",
+ "selected_data_2.plot.line('o-')\n",
+ "plt.title('ghi vs step, init time: 2022-05-10T00:00:00.000000000, long:13.00000, lat:35.0000')\n",
+ "plt.xlabel('step')\n",
+ "plt.ylabel('dhi')\n",
+ "plt.grid(True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 109,
+ "id": "d81cde68",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "KeyError",
+ "evalue": "\"not all values found in index 'init_time'. Try setting the `method` keyword argument (example: method='nearest').\"",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:548\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:2263\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:2273\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n",
+ "\u001b[0;31mKeyError\u001b[0m: 1515196800000000000",
+ "\nDuring handling of the above exception, another exception occurred:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/base.py:3803\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3802\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3803\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:516\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:550\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "\u001b[0;31mKeyError\u001b[0m: Timestamp('2018-01-06 00:00:00')",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/datetimes.py:736\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 735\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 736\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mIndex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m-> 3805\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3807\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3808\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3809\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n",
+ "\u001b[0;31mKeyError\u001b[0m: Timestamp('2018-01-06 00:00:00')",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexes.py:473\u001b[0m, in \u001b[0;36mPandasIndex.sel\u001b[0;34m(self, labels, method, tolerance)\u001b[0m\n\u001b[1;32m 472\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 473\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel_value\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 474\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/datetimes.py:738\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 738\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(orig_key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n",
+ "\u001b[0;31mKeyError\u001b[0m: '2018-01-06T00:00:00.000000000'",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[109], line 30\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m df\n\u001b[1;32m 29\u001b[0m \u001b[38;5;66;03m# Call the function\u001b[39;00m\n\u001b[0;32m---> 30\u001b[0m nan_count_df \u001b[38;5;241m=\u001b[39m \u001b[43mcount_nans\u001b[49m\u001b[43m(\u001b[49m\u001b[43mds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;66;03m# Print the DataFrame\u001b[39;00m\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28mprint\u001b[39m(nan_count_df)\n",
+ "Cell \u001b[0;32mIn[109], line 19\u001b[0m, in \u001b[0;36mcount_nans\u001b[0;34m(ds)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;66;03m# Iterating over each unique pair of x and y\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x, y \u001b[38;5;129;01min\u001b[39;00m product(x_values, y_values):\n\u001b[1;32m 18\u001b[0m \u001b[38;5;66;03m# Select the data for that pair of x and y\u001b[39;00m\n\u001b[0;32m---> 19\u001b[0m selected_data \u001b[38;5;241m=\u001b[39m \u001b[43mds\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvalue\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvariable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdni\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minit_time\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2018-01-06T00:00:00.000000000\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43my\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;66;03m# Counting the NaN values\u001b[39;00m\n\u001b[1;32m 22\u001b[0m nan_count \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39misnan(selected_data\u001b[38;5;241m.\u001b[39mvalues)\u001b[38;5;241m.\u001b[39msum()\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/dataarray.py:1527\u001b[0m, in \u001b[0;36mDataArray.sel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 1417\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msel\u001b[39m(\n\u001b[1;32m 1418\u001b[0m \u001b[38;5;28mself\u001b[39m: T_DataArray,\n\u001b[1;32m 1419\u001b[0m indexers: Mapping[Any, Any] \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1423\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mindexers_kwargs: Any,\n\u001b[1;32m 1424\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T_DataArray:\n\u001b[1;32m 1425\u001b[0m \u001b[38;5;124;03m\"\"\"Return a new DataArray whose data is given by selecting index\u001b[39;00m\n\u001b[1;32m 1426\u001b[0m \u001b[38;5;124;03m labels along the specified dimension(s).\u001b[39;00m\n\u001b[1;32m 1427\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1525\u001b[0m \u001b[38;5;124;03m Dimensions without coordinates: points\u001b[39;00m\n\u001b[1;32m 1526\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1527\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_temp_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1528\u001b[0m \u001b[43m \u001b[49m\u001b[43mindexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1529\u001b[0m \u001b[43m \u001b[49m\u001b[43mdrop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdrop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1530\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1531\u001b[0m \u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1532\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mindexers_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1533\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1534\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_from_temp_dataset(ds)\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/dataset.py:2565\u001b[0m, in \u001b[0;36mDataset.sel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 2504\u001b[0m \u001b[38;5;124;03m\"\"\"Returns a new dataset with each array indexed by tick labels\u001b[39;00m\n\u001b[1;32m 2505\u001b[0m \u001b[38;5;124;03malong the specified dimension(s).\u001b[39;00m\n\u001b[1;32m 2506\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2562\u001b[0m \u001b[38;5;124;03mDataArray.sel\u001b[39;00m\n\u001b[1;32m 2563\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2564\u001b[0m indexers \u001b[38;5;241m=\u001b[39m either_dict_or_kwargs(indexers, indexers_kwargs, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msel\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 2565\u001b[0m query_results \u001b[38;5;241m=\u001b[39m \u001b[43mmap_index_queries\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2566\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\n\u001b[1;32m 2567\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2569\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m drop:\n\u001b[1;32m 2570\u001b[0m no_scalar_variables \u001b[38;5;241m=\u001b[39m {}\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexing.py:183\u001b[0m, in \u001b[0;36mmap_index_queries\u001b[0;34m(obj, indexers, method, tolerance, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 181\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(IndexSelResult(labels))\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 183\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 185\u001b[0m merged \u001b[38;5;241m=\u001b[39m merge_sel_results(results)\n\u001b[1;32m 187\u001b[0m \u001b[38;5;66;03m# drop dimension coordinates found in dimension indexers\u001b[39;00m\n\u001b[1;32m 188\u001b[0m \u001b[38;5;66;03m# (also drop multi-index if any)\u001b[39;00m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;66;03m# (.sel() already ensures alignment)\u001b[39;00m\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexes.py:475\u001b[0m, in \u001b[0;36mPandasIndex.sel\u001b[0;34m(self, labels, method, tolerance)\u001b[0m\n\u001b[1;32m 473\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mget_loc(label_value)\n\u001b[1;32m 474\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 475\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot all values found in index \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcoord_name\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 477\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTry setting the `method` keyword argument (example: method=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnearest\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m).\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 478\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 480\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m label_array\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 481\u001b[0m indexer \u001b[38;5;241m=\u001b[39m label_array\n",
+ "\u001b[0;31mKeyError\u001b[0m: \"not all values found in index 'init_time'. Try setting the `method` keyword argument (example: method='nearest').\""
+ ]
+ }
+ ],
+ "source": [
+ "# function to check quality of the data\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from itertools import product\n",
+ "\n",
+ "# Function to count NaNs for each combination of x and y\n",
+ "def count_nans(ds):\n",
+ " # Get unique values of x and y\n",
+ " x_values = np.unique(ds['x'])\n",
+ " y_values = np.unique(ds['y'])\n",
+ "\n",
+ " # Create an empty DataFrame\n",
+ " df = pd.DataFrame(columns=['x', 'y', 'NaN Count'])\n",
+ "\n",
+ " # Iterating over each unique pair of x and y\n",
+ " for x, y in product(x_values, y_values):\n",
+ " # Select the data for that pair of x and y\n",
+ " selected_data = ds['value'].sel(variable='dni', init_time='2018-01-06T00:00:00.000000000', x=x, y=y)\n",
+ " \n",
+ " # Counting the NaN values\n",
+ " nan_count = np.isnan(selected_data.values).sum()\n",
+ "\n",
+ " # Append these values to a dataframe\n",
+ " df = df.append({'x': x, 'y': y, 'NaN Count': nan_count}, ignore_index=True)\n",
+ " \n",
+ " return df\n",
+ "\n",
+ "# Call the function\n",
+ "nan_count_df = count_nans(ds)\n",
+ "\n",
+ "# Print the DataFrame\n",
+ "print(nan_count_df)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "id": "5bfd9739",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " x | \n",
+ " y | \n",
+ " NaN Count | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 565 | \n",
+ " 14.833333 | \n",
+ " 36.250000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 566 | \n",
+ " 14.833333 | \n",
+ " 36.333333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 567 | \n",
+ " 14.833333 | \n",
+ " 36.416667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 568 | \n",
+ " 14.833333 | \n",
+ " 36.500000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 569 | \n",
+ " 14.833333 | \n",
+ " 36.583333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 570 | \n",
+ " 14.833333 | \n",
+ " 36.666667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 571 | \n",
+ " 14.833333 | \n",
+ " 36.750000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 572 | \n",
+ " 14.833333 | \n",
+ " 36.833333 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 573 | \n",
+ " 14.833333 | \n",
+ " 36.916667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 574 | \n",
+ " 14.833333 | \n",
+ " 37.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 575 | \n",
+ " 14.916667 | \n",
+ " 35.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 576 | \n",
+ " 14.916667 | \n",
+ " 35.083333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 577 | \n",
+ " 14.916667 | \n",
+ " 35.166667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 578 | \n",
+ " 14.916667 | \n",
+ " 35.250000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 579 | \n",
+ " 14.916667 | \n",
+ " 35.333333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 580 | \n",
+ " 14.916667 | \n",
+ " 35.416667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 581 | \n",
+ " 14.916667 | \n",
+ " 35.500000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 582 | \n",
+ " 14.916667 | \n",
+ " 35.583333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 583 | \n",
+ " 14.916667 | \n",
+ " 35.666667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 584 | \n",
+ " 14.916667 | \n",
+ " 35.750000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 585 | \n",
+ " 14.916667 | \n",
+ " 35.833333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 586 | \n",
+ " 14.916667 | \n",
+ " 35.916667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 587 | \n",
+ " 14.916667 | \n",
+ " 36.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 588 | \n",
+ " 14.916667 | \n",
+ " 36.083333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 589 | \n",
+ " 14.916667 | \n",
+ " 36.166667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 590 | \n",
+ " 14.916667 | \n",
+ " 36.250000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 591 | \n",
+ " 14.916667 | \n",
+ " 36.333333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 592 | \n",
+ " 14.916667 | \n",
+ " 36.416667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 593 | \n",
+ " 14.916667 | \n",
+ " 36.500000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 594 | \n",
+ " 14.916667 | \n",
+ " 36.583333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 595 | \n",
+ " 14.916667 | \n",
+ " 36.666667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 596 | \n",
+ " 14.916667 | \n",
+ " 36.750000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 597 | \n",
+ " 14.916667 | \n",
+ " 36.833333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 598 | \n",
+ " 14.916667 | \n",
+ " 36.916667 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 599 | \n",
+ " 14.916667 | \n",
+ " 37.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 600 | \n",
+ " 15.000000 | \n",
+ " 35.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 601 | \n",
+ " 15.000000 | \n",
+ " 35.083333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 602 | \n",
+ " 15.000000 | \n",
+ " 35.166667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 603 | \n",
+ " 15.000000 | \n",
+ " 35.250000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 604 | \n",
+ " 15.000000 | \n",
+ " 35.333333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 605 | \n",
+ " 15.000000 | \n",
+ " 35.416667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 606 | \n",
+ " 15.000000 | \n",
+ " 35.500000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 607 | \n",
+ " 15.000000 | \n",
+ " 35.583333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 608 | \n",
+ " 15.000000 | \n",
+ " 35.666667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 609 | \n",
+ " 15.000000 | \n",
+ " 35.750000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 610 | \n",
+ " 15.000000 | \n",
+ " 35.833333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 611 | \n",
+ " 15.000000 | \n",
+ " 35.916667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 612 | \n",
+ " 15.000000 | \n",
+ " 36.000000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 613 | \n",
+ " 15.000000 | \n",
+ " 36.083333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 614 | \n",
+ " 15.000000 | \n",
+ " 36.166667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 615 | \n",
+ " 15.000000 | \n",
+ " 36.250000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 616 | \n",
+ " 15.000000 | \n",
+ " 36.333333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 617 | \n",
+ " 15.000000 | \n",
+ " 36.416667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 618 | \n",
+ " 15.000000 | \n",
+ " 36.500000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 619 | \n",
+ " 15.000000 | \n",
+ " 36.583333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 620 | \n",
+ " 15.000000 | \n",
+ " 36.666667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 621 | \n",
+ " 15.000000 | \n",
+ " 36.750000 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 622 | \n",
+ " 15.000000 | \n",
+ " 36.833333 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 623 | \n",
+ " 15.000000 | \n",
+ " 36.916667 | \n",
+ " 168.0 | \n",
+ "
\n",
+ " \n",
+ " | 624 | \n",
+ " 15.000000 | \n",
+ " 37.000000 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " x y NaN Count\n",
+ "565 14.833333 36.250000 168.0\n",
+ "566 14.833333 36.333333 168.0\n",
+ "567 14.833333 36.416667 168.0\n",
+ "568 14.833333 36.500000 168.0\n",
+ "569 14.833333 36.583333 168.0\n",
+ "570 14.833333 36.666667 168.0\n",
+ "571 14.833333 36.750000 168.0\n",
+ "572 14.833333 36.833333 0.0\n",
+ "573 14.833333 36.916667 168.0\n",
+ "574 14.833333 37.000000 168.0\n",
+ "575 14.916667 35.000000 168.0\n",
+ "576 14.916667 35.083333 168.0\n",
+ "577 14.916667 35.166667 168.0\n",
+ "578 14.916667 35.250000 168.0\n",
+ "579 14.916667 35.333333 168.0\n",
+ "580 14.916667 35.416667 168.0\n",
+ "581 14.916667 35.500000 168.0\n",
+ "582 14.916667 35.583333 168.0\n",
+ "583 14.916667 35.666667 168.0\n",
+ "584 14.916667 35.750000 168.0\n",
+ "585 14.916667 35.833333 168.0\n",
+ "586 14.916667 35.916667 168.0\n",
+ "587 14.916667 36.000000 168.0\n",
+ "588 14.916667 36.083333 168.0\n",
+ "589 14.916667 36.166667 168.0\n",
+ "590 14.916667 36.250000 168.0\n",
+ "591 14.916667 36.333333 168.0\n",
+ "592 14.916667 36.416667 168.0\n",
+ "593 14.916667 36.500000 168.0\n",
+ "594 14.916667 36.583333 168.0\n",
+ "595 14.916667 36.666667 168.0\n",
+ "596 14.916667 36.750000 168.0\n",
+ "597 14.916667 36.833333 168.0\n",
+ "598 14.916667 36.916667 0.0\n",
+ "599 14.916667 37.000000 168.0\n",
+ "600 15.000000 35.000000 168.0\n",
+ "601 15.000000 35.083333 168.0\n",
+ "602 15.000000 35.166667 168.0\n",
+ "603 15.000000 35.250000 168.0\n",
+ "604 15.000000 35.333333 168.0\n",
+ "605 15.000000 35.416667 168.0\n",
+ "606 15.000000 35.500000 168.0\n",
+ "607 15.000000 35.583333 168.0\n",
+ "608 15.000000 35.666667 168.0\n",
+ "609 15.000000 35.750000 168.0\n",
+ "610 15.000000 35.833333 168.0\n",
+ "611 15.000000 35.916667 168.0\n",
+ "612 15.000000 36.000000 168.0\n",
+ "613 15.000000 36.083333 168.0\n",
+ "614 15.000000 36.166667 168.0\n",
+ "615 15.000000 36.250000 168.0\n",
+ "616 15.000000 36.333333 168.0\n",
+ "617 15.000000 36.416667 168.0\n",
+ "618 15.000000 36.500000 168.0\n",
+ "619 15.000000 36.583333 168.0\n",
+ "620 15.000000 36.666667 168.0\n",
+ "621 15.000000 36.750000 168.0\n",
+ "622 15.000000 36.833333 168.0\n",
+ "623 15.000000 36.916667 168.0\n",
+ "624 15.000000 37.000000 0.0"
+ ]
+ },
+ "execution_count": 110,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "nan_count_df.tail(60)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 111,
+ "id": "32ea5a93",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "KeyError",
+ "evalue": "\"not all values found in index 'init_time'. Try setting the `method` keyword argument (example: method='nearest').\"",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:548\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:2263\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:2273\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n",
+ "\u001b[0;31mKeyError\u001b[0m: 1515196800000000000",
+ "\nDuring handling of the above exception, another exception occurred:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/base.py:3803\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3802\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3803\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:516\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/_libs/index.pyx:550\u001b[0m, in \u001b[0;36mpandas._libs.index.DatetimeEngine.get_loc\u001b[0;34m()\u001b[0m\n",
+ "\u001b[0;31mKeyError\u001b[0m: Timestamp('2018-01-06 00:00:00')",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/datetimes.py:736\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 735\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 736\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mIndex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m-> 3805\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3807\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3808\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3809\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n",
+ "\u001b[0;31mKeyError\u001b[0m: Timestamp('2018-01-06 00:00:00')",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexes.py:473\u001b[0m, in \u001b[0;36mPandasIndex.sel\u001b[0;34m(self, labels, method, tolerance)\u001b[0m\n\u001b[1;32m 472\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 473\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel_value\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 474\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/pandas/core/indexes/datetimes.py:738\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 738\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(orig_key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n",
+ "\u001b[0;31mKeyError\u001b[0m: '2018-01-06T00:00:00.000000000'",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[111], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Select the data for a given init_time, x, and y\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m selected_data \u001b[38;5;241m=\u001b[39m \u001b[43mds\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvalue\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvariable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdni\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minit_time\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2018-01-06T00:00:00.000000000\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m selected_data_2 \u001b[38;5;241m=\u001b[39m selected_data\u001b[38;5;241m.\u001b[39msel(x\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m13.000000\u001b[39m, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m35.000000\u001b[39m , method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnearest\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 6\u001b[0m selected_data_2\u001b[38;5;241m.\u001b[39mvalues\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/dataarray.py:1527\u001b[0m, in \u001b[0;36mDataArray.sel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 1417\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msel\u001b[39m(\n\u001b[1;32m 1418\u001b[0m \u001b[38;5;28mself\u001b[39m: T_DataArray,\n\u001b[1;32m 1419\u001b[0m indexers: Mapping[Any, Any] \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1423\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mindexers_kwargs: Any,\n\u001b[1;32m 1424\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T_DataArray:\n\u001b[1;32m 1425\u001b[0m \u001b[38;5;124;03m\"\"\"Return a new DataArray whose data is given by selecting index\u001b[39;00m\n\u001b[1;32m 1426\u001b[0m \u001b[38;5;124;03m labels along the specified dimension(s).\u001b[39;00m\n\u001b[1;32m 1427\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1525\u001b[0m \u001b[38;5;124;03m Dimensions without coordinates: points\u001b[39;00m\n\u001b[1;32m 1526\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1527\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_temp_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1528\u001b[0m \u001b[43m \u001b[49m\u001b[43mindexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1529\u001b[0m \u001b[43m \u001b[49m\u001b[43mdrop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdrop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1530\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1531\u001b[0m \u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1532\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mindexers_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1533\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1534\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_from_temp_dataset(ds)\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/dataset.py:2565\u001b[0m, in \u001b[0;36mDataset.sel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 2504\u001b[0m \u001b[38;5;124;03m\"\"\"Returns a new dataset with each array indexed by tick labels\u001b[39;00m\n\u001b[1;32m 2505\u001b[0m \u001b[38;5;124;03malong the specified dimension(s).\u001b[39;00m\n\u001b[1;32m 2506\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2562\u001b[0m \u001b[38;5;124;03mDataArray.sel\u001b[39;00m\n\u001b[1;32m 2563\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2564\u001b[0m indexers \u001b[38;5;241m=\u001b[39m either_dict_or_kwargs(indexers, indexers_kwargs, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msel\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 2565\u001b[0m query_results \u001b[38;5;241m=\u001b[39m \u001b[43mmap_index_queries\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2566\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\n\u001b[1;32m 2567\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2569\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m drop:\n\u001b[1;32m 2570\u001b[0m no_scalar_variables \u001b[38;5;241m=\u001b[39m {}\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexing.py:183\u001b[0m, in \u001b[0;36mmap_index_queries\u001b[0;34m(obj, indexers, method, tolerance, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 181\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(IndexSelResult(labels))\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 183\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 185\u001b[0m merged \u001b[38;5;241m=\u001b[39m merge_sel_results(results)\n\u001b[1;32m 187\u001b[0m \u001b[38;5;66;03m# drop dimension coordinates found in dimension indexers\u001b[39;00m\n\u001b[1;32m 188\u001b[0m \u001b[38;5;66;03m# (also drop multi-index if any)\u001b[39;00m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;66;03m# (.sel() already ensures alignment)\u001b[39;00m\n",
+ "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/psp-vzQW2Xvb-py3.10/lib/python3.10/site-packages/xarray/core/indexes.py:475\u001b[0m, in \u001b[0;36mPandasIndex.sel\u001b[0;34m(self, labels, method, tolerance)\u001b[0m\n\u001b[1;32m 473\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mget_loc(label_value)\n\u001b[1;32m 474\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 475\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 476\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot all values found in index \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcoord_name\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 477\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTry setting the `method` keyword argument (example: method=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnearest\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m).\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 478\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 480\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m label_array\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 481\u001b[0m indexer \u001b[38;5;241m=\u001b[39m label_array\n",
+ "\u001b[0;31mKeyError\u001b[0m: \"not all values found in index 'init_time'. Try setting the `method` keyword argument (example: method='nearest').\""
+ ]
+ }
+ ],
+ "source": [
+ "# Select the data for a given init_time, x, and y\n",
+ "selected_data = ds['value'].sel(variable='dni', init_time='2018-01-06T00:00:00.000000000')\n",
+ "\n",
+ "selected_data_2 = selected_data.sel(x=13.000000, y=35.000000 , method='nearest')\n",
+ "\n",
+ "selected_data_2.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 122,
+ "id": "b9e8dbe6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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tWtXTZs2TQMHDtSqVavUrFkzXbhwId32Q4YM0e7duzVu3Dg9/PDDWrBgge677z4ZYzJ93Ox2uzp27KhXX31VHTp00PTp03XfffdpypQp6tKlS6b3y65HHnlEU6dOVevWrfXSSy/J19dX7du3z3T7zp0766+//tKkSZPUuXNnzZs3T+PHj891HNf673//q6VLl+qee+7R5MmTNWrUKP30009q2rSpjh07JunK62XChAmSpAEDBjheL02aNMmwzU6dOqlbt26SpClTpmT4+tqwYYMeffRRde3aVS+//LKSkpIUFxen06dPO7Y5ceKEGjVqpJUrV2rIkCF6/fXXdfPNN6tfv365Oo536NCh+vHHHzV27FgNGjRI//nPf7IcZO9u/yX33gdZKVWqlGbNmiVJuv/++x377tSpU5b3W79+vR5//HH16tVL48aN0+7du3XPPfdoxowZmjZtmh599FGNGjVKmzZtUt++fZ3u+80336hJkyZKSEjQ2LFjNXHiRJ09e1YtWrTQd99951b82WGM0YkTJ1SyZEnHst9//10nT57U7bffnm77hg0b6ocffsjRvpo1a6Zdu3bpueee0/79+3XgwAE9//zz2rp1q5588kmX9//hhx8UGBio6tWrp4spbb2nZHdfCQkJ+u6779SgQQM9/fTTCgkJUbFixVSpUiV9+OGHOd63pHSPf0REhMqVK+fUzx9++EH16tWTj4/zV2nDhg114cIFp/FBY8aMUfXq1fX777+73U93XxMtW7ZUy5Yt0/UrO7G60/+MeKNPtOm99928efNUrFgxjRw5Uq+//rrq16+vf/zjH3rqqacc2zzzzDOqW7euSpYs6fgczup7aNeuXbrnnnt06dIlTZgwQa+99po6duyojRs3SnL9veLu53Dnzp2VlJSkSZMmqV27dpo2bZoGDBiQq8flarl9TyCb3Mlerj4s6I033jBBQUGOsvyDDz5omjdvbowxGVZI0rZLk5ycbGrVqmVatGjhtFz/y5S3bt3qWHb48GETEBBg7r///izjmzp1qpFk3nvvPaf9xMTEmGLFijlKc5nFmJE9e/YYSWb69OlOyx999FFTrFgxp36500cfH590//FIW3f1fzivbdMYYzZt2mQkmXfffdexLO25qV+/vtN/4F5++WUjyXz66aeOZddWSObPn298fHzS/Ydz9uzZRpLZuHFjuhiya8eOHUaSefTRR52Wd+/ePdMKSd++fZ22vf/++02JEiWclmXncB9XkpKS0v238ODBg8bf399MmDDBsczTh2z5+fk5/ffyxx9/TPca69evnylbtqz5448/nO7ftWtXExISkuHr4mqZVUhatWpl7Ha7Y/mIESNMoUKFzNmzZx3Lrn19ZNX/jCok2X0f5PaQrcwqJP7+/k6P/ZtvvmmkK+Msrv4MGDNmjNPzZLfbzS233GLatGnj9BhduHDBVKxY0dx9991ZxpoT8+fPN5KcKl9pj/fV7+80o0aNMpIyrFy6qpAkJiaazp07G5vN5vicLVq0qFm6dGm2Ym3fvr2pVKlSuuXnz583ksxTTz2V4f1yUiHJ7r62b99uJJkSJUqYMmXKmJkzZ5oFCxaYhg0bGpvNlmHl0Zis36Np644cOZJuXYMGDUyjRo0ctwMDA9N9XhljzBdffGEkmWXLljmW9erVK90+s9tPd18TUVFR6d6X2Y3Vnf5nxBt9ok3333fZldF3yf/93/+lq/C5c8jWlClTjCRz6tSpTLfJ7HvFnc/htO+Ajh07OrXx6KOPGknmxx9/zFa8xnjuMwE5l+PT/nbu3FkXL17U559/rr/++kuff/65unfvnun2RYoUccz/+eefOnfunO66664Mz/ARExOj+vXrO26XL19e9957r5YvX67U1NRM9/Hll18qPDzc8R9qSfL19dWwYcOUmJiotWvXuttNValSRXXr1tWiRYscy1JTU/XRRx+pQ4cOTv1yp49NmzZVjRo1XO7/6jZTUlJ0+vRp3XzzzQoNDc2w3QEDBsjX19dxe9CgQSpcuLC+/PLLTPexePFiVa9eXdWqVdMff/zhmFq0aCFJWr16tcs4M5O232HDhjktz+o0ywMHDnS6fdddd+n06dNKSEjIcRwZ8ff3d/y3MDU1VadPn1axYsVUtWpVt86S465WrVqpcuXKjtu1a9dWcHCw/vvf/0q68l/zjz/+WB06dJAxxuk5adOmjc6dO5fj+AYMGOB0xqO77rpLqampOnz4cO46dRV33gfe0LJlS6eKY3R0tCQpLi5OQUFB6ZanPe47duzQvn371L17d50+fdrxmJ8/f14tW7bUunXrZLfbPRbnr7/+qsGDBysmJka9evVyLL948aKkK6/PawUEBDht4w5/f39VqVJFDzzwgN5//3299957uv32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ZcXGxma6j86dO+v333/X22+/nW7dxYsXdf78+RxGL8d+p02b5rTck1d8zamMHtvFixen+3ETGBgoSdm+8rq722cUV1xcnD7++OMMzyznzpWZPcGd/nj6fVC0aNFs7zu36tevr8qVK+vVV191jE24Wm4f99TUVHXp0kWbNm3S4sWLFRMTk+m2cXFx+vzzz3X06FHHslWrVmnv3r168MEH3d536dKlFRoaqiVLlig5OdmxPDExUf/5z39UrVo1R9W2VatWTlPafwfvvfde+fr6aubMmY77G2M0e/Zs3XTTTbrjjjvcjssT++rSpYuOHj3qlNz88ccf+vTTT9WiRQuXh4hcq2bNmqpWrZreeustp9fxrFmzZLPZnA5NfuCBB3TixAl98sknTvtevHixOnTo4JSUHz9+XL/++qvT57M7/XTnNXHgwAEdOHDAaVl2Y3Wn/+fOndOvv/7qdGiPN/pEm55936VJ+z119fdgcnKy077SBAYGZvsQrjNnzqRblvajPu2wp8y+V3LyOTxjxgyn29OnT5ekLH/3uMOd9wRyLlcVEinr4/zStG/fXpMnT1bbtm3VvXt3nTx5UjNmzNDNN9+snTt3ptu+Vq1aatOmjYYNGyZ/f3/Hm8PVqV8HDBigN998U71799a2bdtUoUIFffTRR9q4caOmTp3q9n/Krta5c2c98cQTeuKJJxQWFpYuc3e3j9l1zz33aP78+QoJCVGNGjW0adMmrVy5MtMxDsnJyWrZsqU6d+6sPXv2aObMmWrcuLE6duyY6T569uypDz/8UAMHDtTq1at15513KjU1Vb/++qs+/PBDLV++PMPTE2ZH3bp11a1bN82cOVPnzp3THXfcoVWrVmn//v05as+T7rnnHk2YMEF9+vTRHXfcoZ9++kkLFixQpUqVnLarXLmyQkNDNXv2bAUFBSkwMFDR0dGZjgNKOyHDM888o65du8rX11cdOnRwfABnx0svvaTVq1crOjpa/fv3V40aNXTmzBlt375dK1euzPAD31vc6b+n3wdFihRRjRo1tGjRIlWpUkVhYWGqVauWatWq5YmuOfHx8dE777yj2NhY1axZU3369NFNN92k33//XatXr1ZwcLD+85//5Lj9xx9/XJ999pk6dOigM2fO6L333nNa/9BDDznmn376aS1evFjNmzfXY489psTERL3yyiu69dZb1adP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9et1+PBhXbhwQaVKldJtt92mVq1aKTIy0ltxAgAAANZizIdXZKtCcvHiRb3wwguKjIxUu3bt9NVXX+ns2bMqVKiQ9u/fr7Fjx6pixYpq166dNm/e7O2YAQAAgAJn3bp16tChgyIiImSz2bR06VKn9YmJiRoyZIjKlSunIkWKqEaNGpo9e7bTNklJSRo8eLBKlCihYsWKKS4uTidOnLiOvUgvWxWSKlWqKCYmRm+//bbuvvtu+fr6ptvm8OHDWrhwobp27apnnnlG/fv393iwAAAAgBXywhiS8+fPq06dOurbt686deqUbv3IkSP1zTff6L333lOFChX09ddf69FHH1VERIQ6duwoSRoxYoS++OILLV68WCEhIRoyZIg6deqkjRs3eqRPOZGthOTrr79W9erVs9wmKipKY8aM0RNPPKEjR454JDgAAAAgT8gDp/2NjY1VbGxspuu//fZb9erVS82aNZMkDRgwQG+++aa+++47dezYUefOndOcOXO0cOFCtWjRQpI0d+5cVa9eXZs3b1ajRo1y2pNcydYhW66Skav5+vqqcuXKOQ4IAAAAKEgSEhKcpkuXLuWonTvuuEOfffaZfv/9dxljtHr1au3du1etW7eWJG3btk0pKSlq1aqV4z7VqlVT+fLltWnTJo/0JSfcPstWhQoVNGHCBKogAAAAKEBsXpqkyMhIhYSEOKZJkyblKMLp06erRo0aKleunPz8/NS2bVvNmDFDTZo0kSTFx8fLz89PoaGhTvcrU6aM4uPjc7RPT3A7IRk+fLg++eQTVapUSXfffbc++OCDHGdxAAAAQEF39OhRnTt3zjGNGTMmR+1Mnz5dmzdv1meffaZt27bptdde0+DBg7Vy5UoPR+xZOUpIduzYoe+++07Vq1fX0KFDVbZsWQ0ZMkTbt2/3RowAAACAtYyXJknBwcFOk7+/v9vhXbx4UU8//bQmT56sDh06qHbt2hoyZIi6dOmiV199VZIUHh6u5ORknT171um+J06cUHh4uNv79JQcXxixXr16mjZtmo4dO6axY8fqnXfeUYMGDVS3bl3961//kjGcqBkAAAC4HlJSUpSSkiIfH+ef94UKFZLdbpck1a9fX76+vlq1apVj/Z49e3TkyBHFxMRc13iv5taFEa+WkpKiJUuWaO7cuVqxYoUaNWqkfv366bffftPTTz+tlStXauHChZ6MFQAAALBGHjjLVmJiovbv3++4ffDgQe3YsUNhYWEqX768mjZtqlGjRqlIkSKKiorS2rVr9e6772ry5MmSpJCQEPXr108jR45UWFiYgoODNXToUMXExFh2hi0pBwnJ9u3bNXfuXL3//vvy8fHRww8/rClTpqhatWqObe6//341aNDAo4ECAAAABdnWrVvVvHlzx+2RI0dKknr16qV58+bpgw8+0JgxY9SjRw+dOXNGUVFRevHFFzVw4EDHfaZMmSIfHx/FxcXp0qVLatOmjWbOnHnd+3I1txOSBg0a6O6779asWbN03333ZXiRxIoVK6pr164eCRAAAACwnLFdmTzdphuaNWuW5bCI8PBwzZ07N8s2AgICNGPGDM2YMcOtfXuT2wnJf//7X0VFRWW5TWBgoMsHAwAAAMgvjLkyebpNZHNQ+9WZmKtkBAAAAACyK1sJSc2aNfXBBx8oOTk5y+327dunQYMG6aWXXvJIcAAAAECe4MXT/hZ02Tpka/r06Ro9erQeffRR3X333br99tsVERGhgIAA/fnnn/rll1+0YcMG7dq1S0OGDNGgQYO8HTcAAACAG0C2EpKWLVtq69at2rBhgxYtWqQFCxbo8OHDunjxokqWLKnbbrtNDz/8sHr06KHixYt7O2YAAADg+soDg9pvVG4Nam/cuLEaN27srVgAAAAAFDA5vjAiAAAAUFDYzJXJ020im4PaAQAAAMAbqJAAAAAArnjjrFhUSCRRIQEAAABcSxvU7ukpn9q/f7+WL1+uixcvSlKWV5B3hYQEAAAAQLacPn1arVq1UpUqVdSuXTsdP35cktSvXz89/vjjOWozRwnJgQMH9Oyzz6pbt246efKkJOmrr77Srl27chQEAAAAkKdxYURJ0ogRI1S4cGEdOXJERYsWdSzv0qWLli1blqM23U5I1q5dq1tvvVVbtmzRJ598osTEREnSjz/+qLFjx+YoCAAAAAB539dff61//vOfKleunNPyW265RYcPH85Rm24nJE899ZReeOEFrVixQn5+fo7lLVq00ObNm3MUBAAAAJCnUSGRJJ0/f96pMpLmzJkz8vf3z1GbbickP/30k+6///50y0uXLq0//vgjR0EAAAAAyPvuuusuvfvuu47bNptNdrtdL7/8spo3b56jNt0+7W9oaKiOHz+uihUrOi3/4YcfdNNNN+UoCAAAACBP47S/kqSXX35ZLVu21NatW5WcnKwnn3xSu3bt0pkzZ7Rx48Yctel2haRr164aPXq04uPjHRnRxo0b9cQTT+jhhx/OURAAAAAA8r5atWpp7969aty4se69916dP39enTp10g8//KDKlSvnqE23KyQTJ07U4MGDFRkZqdTUVNWoUUOpqanq3r27nn322RwFAQAAAORp3rhuSD69DklISIieeeYZj7XndkLi5+ent99+W88995x+/vlnJSYm6rbbbtMtt9zisaAAAAAA5D3r1q3Lcn2TJk3cbtPthCRN+fLlVb58+ZzeHQAAAMg3bObK5Ok285tmzZqlW2az/V3pSU1NdbvNbCUkI0eOzHaDkydPdjsIAAAAIE9jULsk6c8//3S6nZKSoh9++EHPPfecXnzxxRy1ma2E5IcffnC6vX37dl2+fFlVq1aVJO3du1eFChVS/fr1cxQEAAAAgLwvJCQk3bK7775bfn5+GjlypLZt2+Z2m9lKSFavXu2Ynzx5soKCgvTvf/9bxYsXl3QlU+rTp4/uuusutwMAAAAAkL+VKVNGe/bsydF93R5D8tprr+nrr792JCOSVLx4cb3wwgtq3bq1Hn/88RwFAgAAACBv27lzp9NtY4yOHz+ul156SXXr1s1Rm24nJAkJCTp16lS65adOndJff/2VoyAAAACAvMwmLwxq92xz10XdunVls9lkjPOD0ahRI/3rX//KUZtuJyT333+/+vTpo9dee00NGzaUJG3ZskWjRo1Sp06dchQEAAAAgLzv4MGDTrd9fHxUqlQpBQQE5LhNtxOS2bNn64knnlD37t2VkpJypZHChdWvXz+98sorOQ4EAAAAyLO4MKIkKSoqyuNtup2QFC1aVDNnztQrr7yiAwcOSJIqV66swMBAjwcHAAAAwFrTpk3L9rbDhg1zu/0cXxgxMDBQtWvXzundAQAAgPyjAF+HZMqUKdnazmazXZ+EpHnz5k5XY7zWN99843YQAAAAQJ5WgBOSa8eNeJrbCcm1p/NKSUnRjh079PPPP6tXr16eigsAAABAAeB2QpJZyWbcuHFKTEzMdUAAAABAXmMzXjjtbz6pkFzrt99+02effaYjR44oOTnZad3kyZPdbi/HY0iu9dBDD6lhw4Z69dVXPdUkAAAAgDxk1apV6tixoypVqqRff/1VtWrV0qFDh2SMUb169XLU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V471zZo1k81mc5oGDhxoYcQAAAB5U8UFk1RxwSQd6PKMYwLyA0srJOXKldNLL72kW265RcYY/fvf/9a9996rH374QTVr1pQk9e/fXxMmTHDcp2jRolaFCwAAgAKKQ7a8x9KEpEOHDk63X3zxRc2aNUubN292JCRFixa19MqRAAAAeVmFd/8pSTr08BiLIwFyJs+MIUlNTdXixYt1/vx5xcTEOJYvWLBA7733nsLDw9WhQwc999xzWVZJLl26pEuXLjluJyQkeDVuAAC8KepfL1sdAvK4w31HWx1CwcAYEq+xPCH56aefFBMTo6SkJBUrVkxLlixRjRo1JEndu3dXVFSUIiIitHPnTo0ePVp79uzRJ598kml7kyZN0vjx49MtJzEBAORH9otJVoeAPO5G+I2T1oe8fAjTZaVIHg7vslI822A+ZTMWP/PJyck6cuSIzp07p48++kjvvPOO1q5d60hKrvbNN9+oZcuW2r9/vypXrpxhe9dWSH7//fcM2wIAAEDecvToUZUrV87qMJwkJSWpYsWKio+P90r74eHhOnjwoAICArzSfn5geUJyrVatWqly5cp688030607f/68ihUrpmXLlqlNmzbZas9ut+vYsWMKCgqSzWbzdLjIQxISEhQZGamjR48qODjY6nDgZTzfBQvPd8HC812wpD3fv/zyi6pWrSofH0tPApuhpKQkJScne6VtPz+/Ap2MSHngkK1r2e12pwrH1Xbs2CFJKlu2bLbb8/HxyXOZNrwr7TTSKBh4vgsWnu+Chee7YLnpppvyZDIiSQEBAQU+afAmSxOSMWPGKDY2VuXLl9dff/2lhQsXas2aNVq+fLkOHDighQsXql27dipRooR27typESNGqEmTJqpdu7aVYQMAAADwEEsTkpMnT+rhhx/W8ePHFRISotq1a2v58uW6++67dfToUa1cuVJTp07V+fPnFRkZqbi4OD377LNWhgwAAADAgyxNSObMmZPpusjISK1du/Y6RoP8zt/fX2PHjpW/v7/VoeA64PkuWHi+Cxae74KF5xt5blA7AAAAgIIjb44cAgAAAFAgkJAAAAAAsAwJCQAAAADLkJAAAAAAsAwJCW5IFSpUkM1mc5peeuklq8OCh8yYMUMVKlRQQECAoqOj9d1331kdErxg3Lhx6d7H1apVszoseNC6devUoUMHRUREyGazaenS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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# 'selected_data' must be 2D for this to work, so let's take a slice along 'step'\n",
+ "selected_data_slice = selected_data.isel(step=10)\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "\n",
+ "# Create the plot\n",
+ "selected_data_slice.plot(ax=ax, x='x', y='y')\n",
+ "\n",
+ "# Set titles and labels\n",
+ "ax.set_title('Map of variable \"dni\" at the initial time \"2018-01-06T00:00:00.000000000\" at step 10')\n",
+ "ax.set_xlabel('Longitude (x)')\n",
+ "ax.set_ylabel('Latitude (y)')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 89,
+ "id": "1e24d887",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "array(True)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Check if there are any non-NaN values in the 'value' data variable\n",
+ "non_nan_exists = ds['value'].notnull().any().compute()\n",
+ "\n",
+ "print(non_nan_exists)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 90,
+ "id": "bf72ef11",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]],\n",
+ "\n",
+ " [[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]],\n",
+ "\n",
+ " [[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]],\n",
+ "\n",
+ " ...,\n",
+ "\n",
+ " [[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]],\n",
+ "\n",
+ " [[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]],\n",
+ "\n",
+ " [[ 0., nan, nan, ..., nan, nan, nan],\n",
+ " [nan, 0., nan, ..., nan, nan, nan],\n",
+ " [nan, nan, 0., ..., nan, nan, nan],\n",
+ " ...,\n",
+ " [nan, nan, nan, ..., 0., nan, nan],\n",
+ " [nan, nan, nan, ..., nan, 0., nan],\n",
+ " [nan, nan, nan, ..., nan, nan, 0.]]])"
+ ]
+ },
+ "execution_count": 90,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "selected_data.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7ac84f74",
+ "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.10.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/nwp/excarta/excarta_processing.py b/nwp/excarta/excarta_processing.py
new file mode 100644
index 0000000..9fb01d6
--- /dev/null
+++ b/nwp/excarta/excarta_processing.py
@@ -0,0 +1,101 @@
+import argparse
+import os
+import pathlib
+from datetime import datetime
+
+import gcsfs
+import numpy as np
+import xarray as xr
+
+
+def _parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("output", type=pathlib.Path, help="Output zarr file")
+ parser.add_argument("year", type=int, help="Year to process")
+ parser.add_argument(
+ "--force",
+ action="store_true",
+ help="Overwrite the output file if it already exists.",
+ )
+
+ return parser.parse_args()
+
+
+def extract_files(args):
+ # initialize a GCSFileSystem
+ gcs = gcsfs.GCSFileSystem(project="excarta")
+ path = f"gs://excarta-public-us/pilots/ocf/{args.year}/"
+ files = gcs.ls(path)
+ datasets = []
+
+ for file in files:
+ filename = os.path.basename(file)
+
+ # extract date part from filename
+ date_part = filename.split(".")[0] # adjust this line if necessary
+
+ # # convert date_part into a datetime
+ date = datetime.strptime(date_part, "%Y%m%d%H") # adjust format string if necessary
+
+ print(date)
+ # convert the date to numpy datetime64
+ date_np = np.datetime64(date)
+
+ # load the Zarr store as an xarray Dataset
+ ds = xr.open_zarr(gcs.get_mapper(file), consolidated=True)
+ ds = ds.assign_coords(ts=date_np)
+
+ # calculate time differences in hours
+ step_values = (ds["datetimes"].values - date_np) / np.timedelta64(1, "h")
+ ds = ds.assign_coords(time=step_values)
+ ds = ds.rename({"time": "step"})
+
+ # add 'locidx' to the coordinates
+ ds = ds.assign_coords(locidx=ds["locidx"])
+ ds = ds.set_coords(["latitude", "longitude"])
+
+ # add to the list of datasets
+ datasets.append(ds)
+
+ return datasets
+
+
+def merged_zarrs(ds):
+ ds_merged = xr.concat(ds, dim="ts")
+ ds_merged = ds_merged.drop_vars("datetimes")
+
+ var_names = ds_merged.data_vars
+ d2 = xr.concat([ds_merged[v] for v in var_names], dim="variable")
+ d2 = d2.assign_coords(variable=("variable", var_names))
+ ds_merged = xr.Dataset(dict(value=d2))
+ ds_merged = ds_merged.sortby("step")
+ ds_merged = ds_merged.sortby("ts")
+
+ ds_merged["step"] = (
+ "step",
+ np.array(ds_merged["step"].values, dtype="timedelta64[h]"),
+ )
+
+ return ds_merged
+
+
+def main():
+ args = _parse_args()
+
+ output_path = f"{args.output}/excarta_{args.year}.zarr"
+
+ # if args.output.exists() and not args.force:
+ # raise RuntimeError(f'Output file "{args.output}" already exist')
+
+ datasets = extract_files(args)
+ print("merging zarrs")
+ ds_merged = merged_zarrs(datasets)
+ print("zarrs merged")
+
+ ds_merged.to_zarr(output_path)
+
+ print("file saved at output_path")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/nwp/excarta/merge_excarta.py b/nwp/excarta/merge_excarta.py
new file mode 100644
index 0000000..2684ad5
--- /dev/null
+++ b/nwp/excarta/merge_excarta.py
@@ -0,0 +1,66 @@
+# import libs
+import argparse
+import os
+import pathlib
+
+import numpy as np
+import xarray as xr
+
+
+def _parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("input", type=pathlib.Path, help="Path to folder containing files")
+ parser.add_argument(
+ "output",
+ type=pathlib.Path,
+ help="Output path, include the file name with .zarr ending",
+ )
+ return parser.parse_args()
+
+
+def merge_zarr_files(zarr_path, merged_zarr_path):
+ # Collect paths of Zarr files in the specified directory
+ zarr_files = [
+ os.path.join(zarr_path, file) for file in os.listdir(zarr_path) if file.endswith(".zarr")
+ ]
+
+ # Open the datasets and store them in a list
+ datasets = [xr.open_dataset(file) for file in zarr_files]
+
+ # Concatenate the datasets along the 'init_time' dimension
+ merged_ds = xr.concat(datasets, dim="init_time")
+
+ merged_ds = merged_ds.sortby("init_time")
+
+ # Define the specific range of x and y coordinates
+ # x_range = (-10, 2) # Example x coordinate range
+ # y_range = (49, 59) # Example y coordinate range
+
+ # Iterate over the remaining Zarr files and merge them into the initial dataset
+ # for file in zarr_files[1:]:
+ # xr.open_zarr(file)
+ # print(file)
+
+ # # ds_filt = ds.sel(x=slice(*x_range), y=slice(*y_range))
+ # merged_ds = merged_ds.combine_first(ds_filt)
+
+ # Rechunk the merged dataset
+ # merged_ds = merged_ds.chunk(chunks={"init_time": 10, "x": 100, "y": 100})
+
+ # Get dims/coords into correct type
+ step_hours = merged_ds["step"].values
+ step_timedelta = np.timedelta64(1, "h") * step_hours
+ ds_timedelta = merged_ds.assign_coords(step=step_timedelta)
+
+ # Save the merged dataset as a new Zarr file
+ ds_timedelta.to_zarr(merged_zarr_path)
+
+
+def main():
+ args = _parse_args()
+ merge_zarr_files(args.input, args.output)
+
+
+# Check if script is being run directly
+if __name__ == "__main__":
+ main()
diff --git a/nwp/excarta/parse_excarta_monthly.py b/nwp/excarta/parse_excarta_monthly.py
new file mode 100644
index 0000000..9666e57
--- /dev/null
+++ b/nwp/excarta/parse_excarta_monthly.py
@@ -0,0 +1,144 @@
+# Low memory script
+import argparse
+import os
+import pathlib
+from datetime import datetime
+
+import pandas as pd
+import xarray as xr
+
+
+def _parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("output", type=pathlib.Path, help="Output zarr file")
+ parser.add_argument("year", type=int, help="Year to process")
+ parser.add_argument("month", type=int, help="Month to process")
+ return parser.parse_args()
+
+
+def data_loader(folder_path, month_to_process):
+ """
+ Loads and transforms data from CSV files in the given folder_path and directly convert each DataFrame into an xarray Dataset.
+ Only process files for the month 'YYYYMM' given by month_to_process
+ """
+ month_to_process = datetime.strptime(month_to_process, "%Y%m")
+ column_names = [
+ "DateTimeUTC",
+ "LocationId",
+ "Latitude",
+ "Longitude",
+ "dni",
+ "dhi",
+ "ghi",
+ ]
+ files = os.listdir(folder_path)
+ datasets = []
+
+ for filename in files:
+ if filename.endswith(".csv") and not filename.startswith("._"):
+ file_datetime = datetime.strptime(filename[:-4], "%Y%m%d%H")
+
+ if (file_datetime.year == month_to_process.year) and (
+ file_datetime.month == month_to_process.month
+ ):
+ file_path = os.path.join(folder_path, filename)
+ df = pd.read_csv(
+ file_path,
+ header=None,
+ names=column_names,
+ parse_dates=["DateTimeUTC"],
+ )
+
+ df["step"] = (
+ df["DateTimeUTC"] - file_datetime
+ ).dt.total_seconds() / 3600 # convert timedelta to hours
+ df["init_time"] = file_datetime
+
+ # Convert the dataframe to an xarray Dataset and append to the list
+ ds = xr.Dataset.from_dataframe(df)
+ ds = ds.drop_vars(["LocationId", "DateTimeUTC"])
+ datasets.append(ds)
+
+ return datasets
+
+
+def load_data_from_all_years(parent_folder_path, month_to_process):
+ all_datasets = []
+
+ # Get 'year' part from month_to_process 'YYYYMM' in string format
+ year_to_process = int(month_to_process[:4])
+
+ folder_path = os.path.join(parent_folder_path, str(year_to_process))
+ datasets = data_loader(folder_path, month_to_process)
+ all_datasets.extend(datasets)
+
+ return all_datasets
+
+
+def pdtocdf(datasets):
+ """
+ Processes the xarray Datasets and merges them.
+ """
+
+ datasets = [
+ ds.set_index(index=["init_time", "step", "Latitude", "Longitude"]) for ds in datasets
+ ]
+
+ ds = xr.concat(datasets, dim="index")
+
+ # Subtract one hour from the init_time dimension
+ ds["init_time"] = ds["init_time"] - pd.Timedelta(hours=1)
+
+ # # Define the specific range of x and y coordinates to filter the data on
+ # x_range = (-10, 2) # Example x coordinate range
+ # y_range = (49, 59) # Example y coordinate range
+
+ ds = ds.rename({"Latitude": "y", "Longitude": "x"})
+
+ var_names = ds.data_vars
+ d2 = xr.concat([ds[v] for v in var_names], dim="variable")
+ d2 = d2.assign_coords(variable=("variable", var_names))
+ ds = xr.Dataset(dict(value=d2))
+ ds = ds.sortby("step")
+ ds = ds.sortby("init_time")
+
+ return ds
+
+
+def main():
+ args = _parse_args()
+
+ if args.output.exists():
+ raise RuntimeError(f'Output file "{args.output}" already exist')
+
+ PATH = "/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data"
+ month_to_process = (
+ f"{args.year}{args.month:02d}" # combine year and month arguments into the required format
+ )
+ datasets = load_data_from_all_years(PATH, month_to_process)
+ ds = pdtocdf(datasets)
+
+ print(ds.dims)
+ print(ds.coords)
+
+ # ds = ds.sel(x=slice(float(-10), float(2)), y=slice(float(49), float(59)))
+
+ print(ds)
+ ds = ds.unstack("index")
+
+ # selecting data based on just a sinlge point for Malta,
+ # TO DO: this would get change to be a slice for the future
+ ds_filt = ds.sel(x=14, y=36)
+
+ print(ds_filt)
+
+ file_ending = ".zarr"
+
+ # Create output directory name including the year and month to process
+ output_name = f"{args.output}{args.year}{args.month:02d}{file_ending}"
+ ds_filt.to_zarr(output_name)
+
+
+# Check if script is being run directly
+if __name__ == "__main__":
+ main()
diff --git a/nwp/excarta/parse_excarta_to_output.py b/nwp/excarta/parse_excarta_to_output.py
new file mode 100644
index 0000000..bcd275d
--- /dev/null
+++ b/nwp/excarta/parse_excarta_to_output.py
@@ -0,0 +1,105 @@
+import argparse
+import datetime
+import os
+import pathlib
+from datetime import datetime
+
+import pandas as pd
+import xarray as xr
+
+
+def _parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("output", type=pathlib.Path, help="Output zarr file")
+ return parser.parse_args()
+
+
+def data_loader(folder_path):
+ """
+ Loads and transforms data from CSV files in the given folder_path.
+ """
+ column_names = [
+ "DateTimeUTC",
+ "LocationId",
+ "Latitude",
+ "Longitude",
+ "dni",
+ "dhi",
+ "ghi",
+ ]
+ files = os.listdir(folder_path)
+ dfs = []
+
+ for filename in files:
+ if filename.endswith(".csv") and not filename.startswith("._"):
+ file_path = os.path.join(folder_path, filename)
+ df = pd.read_csv(
+ file_path, header=None, names=column_names, parse_dates=["DateTimeUTC"]
+ )
+
+ datetime_str = filename[:-4]
+ datetime_obj = datetime.strptime(datetime_str, "%Y%m%d%H")
+
+ df["step"] = (
+ df["DateTimeUTC"] - datetime_obj
+ ).dt.total_seconds() / 3600 # convert timedelta to hours
+ df["init_time"] = datetime_obj
+ dfs.append(df)
+
+ return dfs
+
+
+def load_data_from_all_years(parent_folder_path):
+ """
+ Loads data from all the year folders under the parent path.
+ """
+ all_dataframes = []
+
+ # Actual date range is 2018 to 2022 (for in range use (2018,2023))
+ for year in range(2018, 2019):
+ folder_path = os.path.join(parent_folder_path, str(year))
+ dataframes = data_loader(folder_path)
+ all_dataframes.extend(dataframes)
+
+ return all_dataframes
+
+
+def pdtocdf(dfs):
+ """
+ Converts pandas dataframe to an xarray dataset.
+ """
+ merged_df = pd.concat(dfs, ignore_index=True)
+
+ ds = xr.Dataset.from_dataframe(merged_df)
+ ds = ds.set_index(index=["init_time", "step", "Latitude", "Longitude"]).unstack("index")
+ ds = ds.drop_vars(["LocationId", "DateTimeUTC"])
+
+ var_names = ds.data_vars
+ d2 = xr.concat([ds[v] for v in var_names], dim="variable")
+ d2 = d2.assign_coords(variable=("variable", var_names))
+ ds = xr.Dataset(dict(value=d2))
+ ds = ds.sortby("step")
+ ds = ds.sortby("init_time")
+ ds = ds.rename({"Latitude": "y", "Longitude": "x"})
+
+ return ds
+
+
+def main():
+ """
+ Main function to control the flow of the script.
+ """
+ args = _parse_args()
+
+ if args.output.exists():
+ raise RuntimeError(f'Output file "{args.output}" already exist')
+
+ PATH = "/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data"
+ dfs = load_data_from_all_years(PATH)
+ ds = pdtocdf(dfs)
+ ds.to_zarr(args.output)
+
+
+# Check if script is being run directly
+if __name__ == "__main__":
+ main()
diff --git a/nwp/excarta/parse_excarta_to_output_low_mem.py b/nwp/excarta/parse_excarta_to_output_low_mem.py
new file mode 100644
index 0000000..e6cb3d1
--- /dev/null
+++ b/nwp/excarta/parse_excarta_to_output_low_mem.py
@@ -0,0 +1,112 @@
+# Low memory script
+import os
+import pathlib
+from datetime import datetime
+
+import pandas as pd
+import xarray as xr
+
+
+def _parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("output", type=pathlib.Path, help="Output zarr file")
+ return parser.parse_args()
+
+
+def data_loader(folder_path):
+ """
+ Loads and transforms data from CSV files in the given folder_path and directly convert each DataFrame into an xarray Dataset.
+ """
+ column_names = [
+ "DateTimeUTC",
+ "LocationId",
+ "Latitude",
+ "Longitude",
+ "dni",
+ "dhi",
+ "ghi",
+ ]
+ files = os.listdir(folder_path)
+ datasets = []
+
+ for filename in files:
+ if filename.endswith(".csv") and not filename.startswith("._"):
+ file_path = os.path.join(folder_path, filename)
+
+ df = pd.read_csv(
+ file_path, header=None, names=column_names, parse_dates=["DateTimeUTC"]
+ )
+ datetime_str = filename[:-4]
+ datetime_obj = datetime.strptime(datetime_str, "%Y%m%d%H")
+ df["step"] = (
+ df["DateTimeUTC"] - datetime_obj
+ ).dt.total_seconds() / 3600 # convert timedelta to hours
+ df["init_time"] = datetime_obj
+
+ # Convert the dataframe to an xarray Dataset and append to the list
+ ds = xr.Dataset.from_dataframe(df)
+ ds = ds.drop_vars(["LocationId", "DateTimeUTC"])
+ datasets.append(ds)
+
+ return datasets
+
+
+def load_data_from_all_years(parent_folder_path):
+ all_datasets = []
+
+ for year in range(2017, 2019):
+ folder_path = os.path.join(parent_folder_path, str(year))
+ datasets = data_loader(folder_path)
+ all_datasets.extend(datasets)
+
+ return all_datasets
+
+
+def pdtocdf(datasets):
+ """
+ Processes the xarray Datasets and merges them.
+ """
+ print(datasets)
+ # ds = xr.merge(datasets)
+
+ datasets = [
+ ds.set_index(index=["init_time", "step", "Latitude", "Longitude"]) for ds in datasets
+ ]
+
+ ds = xr.concat(datasets, dim="index")
+
+ # Going to unstack and then combine in a different script
+ # Get rid of the index dimension and just keep the desired ones
+ # ds = ds.unstack('index')
+
+ var_names = ds.data_vars
+ d2 = xr.concat([ds[v] for v in var_names], dim="variable")
+ d2 = d2.assign_coords(variable=("variable", var_names))
+ ds = xr.Dataset(dict(value=d2))
+ ds = ds.sortby("step")
+ ds = ds.sortby("init_time")
+ ds = ds.rename({"Latitude": "y", "Longitude": "x"})
+
+ return ds
+
+
+def main():
+ args = _parse_args()
+
+ if args.output.exists():
+ raise RuntimeError(f'Output file "{args.output}" already exist')
+
+ PATH = "/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/solar_data"
+ datasets = load_data_from_all_years(PATH)
+ ds = pdtocdf(datasets)
+
+ print(ds)
+
+ ds = ds.unstack("index")
+
+ ds.to_zarr(args.output)
+
+
+# Check if script is being run directly
+if __name__ == "__main__":
+ main()
diff --git a/nwp/excarta/run_script_excarta.sh b/nwp/excarta/run_script_excarta.sh
new file mode 100755
index 0000000..633fde6
--- /dev/null
+++ b/nwp/excarta/run_script_excarta.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# Path to the Python script
+SCRIPT_PATH="/home/zak/nwp/nwp/excarta/parse_excarta_monthly.py"
+
+# Output directory for the Zarr files
+OUTPUT_DIRECTORY="/mnt/storage_b/data/ocf/solar_pv_nowcasting/experimental/Excarta/sr_UK_Malta_full/zarr_format/r4/Malta/monthly/malta_excarta_"
+
+# Iterate over the range of years
+for year in {2018..2022}
+do
+ # Iterate over the range of months
+ for month in {1..12}
+ do
+ echo "Processing data for ${year}-${month}..."
+ python $SCRIPT_PATH $OUTPUT_DIRECTORY $year $month
+ done
+done
diff --git a/nwp/icon/app.py b/nwp/icon/app.py
index d41bb9b..e3b16fb 100644
--- a/nwp/icon/app.py
+++ b/nwp/icon/app.py
@@ -33,13 +33,13 @@ def download_model_files(runs=None, parent_folder=None, model="global"):
var_2d_list = GLOBAL_VAR2D_LIST
invariant = GLOBAL_INVARIENT_LIST
pressure_levels = GLOBAL_PRESSURE_LEVELS
- f_steps = list(range(0, 79)) + list(range(81, 99, 3)) # 4 days
+ f_steps = list(range(0, 79)) + list(range(81, 99, 3)) # 4 days
else:
var_3d_list = EU_VAR3D_LIST
var_2d_list = EU_VAR2D_LIST
invariant = None
pressure_levels = EU_PRESSURE_LEVELS
- f_steps = list(range(0, 79)) + list(range(81, 123, 3)) # 5 days
+ f_steps = list(range(0, 79)) + list(range(81, 123, 3)) # 5 days
for run in runs:
run_folder = os.path.join(parent_folder, run)
if not os.path.exists(run_folder):
@@ -69,7 +69,12 @@ def download_model_files(runs=None, parent_folder=None, model="global"):
def process_model_files(
- folder, var_3d_list=None, var_2d_list=None, invariant_list=None, model="global", run="00"
+ folder,
+ var_3d_list=None,
+ var_2d_list=None,
+ invariant_list=None,
+ model="global",
+ run="00",
):
if model == "global":
var_base = "icon_global_icosahedral"
@@ -87,7 +92,7 @@ def process_model_files(
)
lons = lon_ds.tlon.values
lats = lat_ds.tlat.values
- f_steps = list(range(0, 79)) + list(range(81, 99, 3)) # 4 days
+ f_steps = list(range(0, 79)) + list(range(81, 99, 3)) # 4 days
else:
var_base = "icon-eu_europe_regular-lat-lon"
var_3d_list = EU_VAR3D_LIST
diff --git a/scripts/convert_icon_archive.py b/scripts/convert_icon_archive.py
index 257ecec..6b1ffbe 100644
--- a/scripts/convert_icon_archive.py
+++ b/scripts/convert_icon_archive.py
@@ -6,8 +6,11 @@
"""
+import multiprocessing as mp
import os
+import subprocess
from glob import glob
+from pathlib import Path
import xarray as xr
import zarr
@@ -18,10 +21,7 @@
EU_VAR2D_LIST,
EU_VAR3D_LIST,
)
-import subprocess
-from pathlib import Path
-import multiprocessing as mp
def decompress(full_bzip_filename: Path, temp_pth: Path) -> str:
"""
@@ -38,7 +38,7 @@ def decompress(full_bzip_filename: Path, temp_pth: Path) -> str:
base_nat_filename = os.path.splitext(base_bzip_filename)[0]
full_nat_filename = os.path.join(temp_pth, base_nat_filename)
if os.path.exists(full_nat_filename):
- return full_nat_filename # Don't decompress a second time
+ return full_nat_filename # Don't decompress a second time
with open(full_nat_filename, "wb") as nat_file_handler:
process = subprocess.run(
["pbzip2", "--decompress", "--keep", "--stdout", full_bzip_filename],
@@ -179,8 +179,8 @@ def upload_to_hf(dataset_xr, folder, model="eu", run="00", token=None):
encoding = {var: {"compressor": Blosc2("zstd", clevel=9)} for var in dataset_xr.data_vars}
encoding["time"] = {"units": "nanoseconds since 1970-01-01"}
with zarr.ZipStore(
- zarr_path,
- mode="w",
+ zarr_path,
+ mode="w",
) as store:
dataset_xr.chunk(chunking).to_zarr(store, encoding=encoding, compute=True)
done = False
@@ -189,10 +189,10 @@ def upload_to_hf(dataset_xr, folder, model="eu", run="00", token=None):
api.upload_file(
path_or_fileobj=zarr_path,
path_in_repo=f"data/{dataset_xr.time.dt.year.values}/"
- f"{dataset_xr.time.dt.month.values}/"
- f"{dataset_xr.time.dt.day.values}/"
- f"{dataset_xr.time.dt.year.values}{str(dataset_xr.time.dt.month.values).zfill(2)}{str(dataset_xr.time.dt.day.values).zfill(2)}"
- f"_{str(dataset_xr.time.dt.hour.values).zfill(2)}.zarr.zip",
+ f"{dataset_xr.time.dt.month.values}/"
+ f"{dataset_xr.time.dt.day.values}/"
+ f"{dataset_xr.time.dt.year.values}{str(dataset_xr.time.dt.month.values).zfill(2)}{str(dataset_xr.time.dt.day.values).zfill(2)}"
+ f"_{str(dataset_xr.time.dt.hour.values).zfill(2)}.zarr.zip",
repo_id="openclimatefix/dwd-icon-global"
if model == "global"
else "openclimatefix/dwd-icon-eu",