{
"cells": [
{
"cell_type": "markdown",
"id": "326cef8d-1d19-4aaa-8234-38cf31f84bc8",
"metadata": {},
"source": [
"# Guideline for how to get started when using data in CSV files"
]
},
{
"cell_type": "markdown",
"id": "c1b5906d-b5c8-4fc5-b76f-14f22448be18",
"metadata": {},
"source": [
"_Maybe some general remarks on working with CSV data in OpenSense?_"
]
},
{
"cell_type": "markdown",
"id": "2ff5bc00",
"metadata": {},
"source": [
"## PWS data\n",
"This notebook gives an example how to get started using single PWS csv-files. The following exmaples uses a subset data from the AMS dateset published by de Vos et al. (2019). \n",
"PWS data which are dowloaded using the API come as individual csv files and should also include a meta file with PWS IDs and coordinates. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "a7754105",
"metadata": {},
"outputs": [],
"source": [
"import datetime\n",
"import glob\n",
"import warnings\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import xarray as xr\n",
"\n",
"warnings.simplefilter(action=\"ignore\", category=FutureWarning)"
]
},
{
"cell_type": "markdown",
"id": "84e2dfae-160a-432c-9f6f-8bda26aff3a0",
"metadata": {},
"source": [
"### Functions for checking data"
]
},
{
"cell_type": "markdown",
"id": "5fef4176",
"metadata": {},
"source": [
"It is quite frequent, that Netamo PWS have identical coordinates. This indicates that the users have not used the web interface from Netatmo correctly to place their PWS which leads to a false location information. This function is used later on to remove PWS with identical coordinates. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "2f13c5fb",
"metadata": {},
"outputs": [],
"source": [
"# Small function to remove PWS with duplicate coordinates from an xarray.Dataset\n",
"def get_duplicate_coordinates(ds, id_var_name=\"id\", keep=False, lat=\"lat\", lon=\"lon\"): # noqa: D103\n",
" # lat and lon can be set if a dataset does not follow our OS cenvention\n",
" df_data = ds[id_var_name].to_dataframe() # assumes that there is an 'id' dimension\n",
" # return a boolean series which can easily be used for indexing in the initial `ds`\n",
" return df_data.duplicated(subset=[lon, lat], keep=keep)"
]
},
{
"cell_type": "markdown",
"id": "2341289d",
"metadata": {},
"source": [
"Netatmo PWS data can have a temporal resolution up to ~5 Min. However, these invervals are not exactly 5 minutes and can occasionally be a bit longer which leads to either missing time stamps in the data series or single timestamps with missing data. The following functions checks for complete time series with NaN for the missing values. Otherwise the missing dates are infilled by reindexing the dataframe.\n",
"\n",
"Note that this function uses specific metadata entries for the AMS PWS dataset. This function works only if all the timestamps start at at full 5 minutes. This needs to be adjusted accordingly for other datasets."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "c91a3888-7111-46de-b424-7cfa7dd73e87",
"metadata": {},
"outputs": [],
"source": [
"def reindex_timestamps(df_data): # noqa: D103\n",
" # check if timestamps are complete\n",
" start = df_data.index[0]\n",
" end = df_data.index[-1]\n",
" dates = pd.date_range(start=start, end=end, freq=\"5Min\")\n",
" if len(df_data.index) != len(dates):\n",
" print(f\"File {fn} has missing time steps, reindexing\") # noqa: T201\n",
" df_data = df_data.reindex(dates)\n",
" return df_data"
]
},
{
"cell_type": "markdown",
"id": "8b0e2076-e395-4d11-ad4a-9ecf8bd5fda3",
"metadata": {},
"source": [
"### Read CSV raw data file"
]
},
{
"cell_type": "markdown",
"id": "c8c50914-64b0-429e-96b1-d3ec0610932d",
"metadata": {},
"source": [
"Let's get a list of the all the raw data files. In the next steps we will use only one file, but later we want to loop through all files."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "a1368e14-7e1a-4020-b213-67c183785963",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['csv_cookbook_data/ams1.csv',\n",
" 'csv_cookbook_data/ams2.csv',\n",
" 'csv_cookbook_data/ams3.csv',\n",
" 'csv_cookbook_data/ams4.csv',\n",
" 'csv_cookbook_data/ams5.csv',\n",
" 'csv_cookbook_data/ams6.csv',\n",
" 'csv_cookbook_data/ams7.csv',\n",
" 'csv_cookbook_data/ams8.csv',\n",
" 'csv_cookbook_data/ams9.csv']"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fn_list = sorted(glob.glob(\"csv_cookbook_data/ams*.csv\")) # noqa: PTH207\n",
"fn_list"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "27bf150e-6d74-4ab2-a432-edd78e2e1e6f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" ams1 \n",
" \n",
" \n",
" Time \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 2016-05-01 00:05:00 \n",
" 0.0 \n",
" \n",
" \n",
" 2016-05-01 00:10:00 \n",
" 0.0 \n",
" \n",
" \n",
" 2016-05-01 00:15:00 \n",
" 0.0 \n",
" \n",
" \n",
" 2016-05-01 00:20:00 \n",
" 0.0 \n",
" \n",
" \n",
" 2016-05-01 00:25:00 \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" ams1\n",
"Time \n",
"2016-05-01 00:05:00 0.0\n",
"2016-05-01 00:10:00 0.0\n",
"2016-05-01 00:15:00 0.0\n",
"2016-05-01 00:20:00 0.0\n",
"2016-05-01 00:25:00 0.0"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pws_data = pd.read_csv(fn_list[0], index_col=0, parse_dates=True, sep=\",\")\n",
"pws_data.head()"
]
},
{
"cell_type": "markdown",
"id": "4dcc60fa-da22-45b8-b209-a1448cf2e649",
"metadata": {},
"source": [
"### Read in CSV metadata file"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "b126133f",
"metadata": {},
"outputs": [],
"source": [
"# Load metadata from the Amsterdam PWS data set (showcase subset with 9 PWS)\n",
"pws_meta = pd.read_csv(\"csv_cookbook_data/AMS_metadatasubset.csv\", sep=\",\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "5be82826-4ffb-4b74-87bb-3523784e1e5d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" ID \n",
" lon \n",
" lat \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" ams1 \n",
" 4.670664 \n",
" 52.305896 \n",
" \n",
" \n",
" 1 \n",
" ams2 \n",
" 4.674940 \n",
" 52.302044 \n",
" \n",
" \n",
" 2 \n",
" ams3 \n",
" 4.677275 \n",
" 52.308427 \n",
" \n",
" \n",
" 3 \n",
" ams4 \n",
" 4.677554 \n",
" 52.346013 \n",
" \n",
" \n",
" 4 \n",
" ams5 \n",
" 4.678593 \n",
" 52.318572 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" ID lon lat\n",
"0 ams1 4.670664 52.305896\n",
"1 ams2 4.674940 52.302044\n",
"2 ams3 4.677275 52.308427\n",
"3 ams4 4.677554 52.346013\n",
"4 ams5 4.678593 52.318572"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pws_meta.head()"
]
},
{
"cell_type": "markdown",
"id": "0439e8f7-6743-412c-9275-62c791b36059",
"metadata": {},
"source": [
"### Convert data from `pandas.Dataframe` to `xarray.Dataset` including metadata"
]
},
{
"cell_type": "markdown",
"id": "d152b7fc-e7ac-42cf-846e-d90f507e8440",
"metadata": {},
"source": [
"The following function converts the `pandas.Dataframe` to `xarray.Dataset` including metadata. This follows the data conventions defined in the OpenSense Cost Action (link to white paper)\n",
"\n",
"Note that this function uses specific metadata entries for the AMS PWS dataset. This needs to be adjusted accordingly for other dataset."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "1469b5ff-b31a-425e-8bfa-028cd80bf6a1",
"metadata": {},
"outputs": [],
"source": [
"def dataframe_to_dataset(pws_data, lon, lat, elevation=None): # noqa: D103\n",
" pws_data.index = pws_data.index.rename(\"time\")\n",
"\n",
" ds = pws_data.to_xarray().to_array(dim=\"id\")\n",
"\n",
" ds = ds.to_dataset(name=\"rainfall\")\n",
"\n",
" if elevation is None:\n",
" ds = ds.assign_coords({\"elevation\": xr.full_like(ds.id, np.nan)})\n",
" else:\n",
" ds = ds.assign_coords({\"elevation\": elevation})\n",
"\n",
" ds = ds.assign_coords({\"lon\": lon})\n",
" ds = ds.assign_coords({\"lat\": lat})\n",
" # Important: Set the reference, otherwise the first time step is used.\n",
" ds.time.encoding[\"units\"] = \"seconds since 1970-01-01 00:00:00\"\n",
"\n",
" # variable attributes\n",
" ds.rainfall.attrs = {\n",
" \"name\": \"rainfall\",\n",
" \"long_name\": \"rainfall amount per time unit\",\n",
" \"units\": \"mm\",\n",
" \"coverage_contant_type\": \"physicalMeasurement\",\n",
" }\n",
"\n",
" # coordiate attributes\n",
" ds.time.attrs = {\"unit\": \"seconds since 1970-01-01 00:00:00\"}\n",
" ds.lon.attrs = {\"units\": \"degrees in WGS84 projection\"}\n",
" ds.lat.attrs = {\"units\": \"degrees in WGS84 projection\"}\n",
" ds.elevation.attrs = {\"units\": \"meters\", \"longname\": \"meters_above_sea\"}\n",
"\n",
" # global Atrributes\n",
" ds.attrs[\"title\"] = \"PWS data from Amsterdam\"\n",
" ds.attrs[\n",
" \"institution\"\n",
" ] = \"Wageningen University and Research, Department of Environmental Sciences\"\n",
" ds.attrs[\"history\"] = \"Subset of the orignal PWS dataset from de Vos et al. (2019)\"\n",
" ds.attrs[\"references\"] = \"https://doi.org/10.1029/2019GL083731\"\n",
" ds.attrs[\"date_created\"] = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n",
" ds.attrs[\"Conventions\"] = \"OpenSense-0.1\"\n",
" ds.attrs[\n",
" \"license restrictions\"\n",
" ] = \"CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/\"\n",
" ds.attrs[\"location\"] = \"Amsterdam (NL)\"\n",
" ds.attrs[\"source\"] = \"Netatmo PWS\"\n",
" ds.attrs[\"comment\"] = \"\"\n",
"\n",
" return ds"
]
},
{
"cell_type": "markdown",
"id": "79da101b-0263-4ad6-8840-2bc66eedebe9",
"metadata": {},
"source": [
"### Parse raw data and convert to `xarray.Dataset` with metadata"
]
},
{
"cell_type": "markdown",
"id": "8f3d4434-8970-4b0b-8ae4-20fe80226103",
"metadata": {},
"source": [
"PWS ams1 has single timestamps with missing data, PWS ams2, ams6 and ams7 have empty timestemps (which corresponds to NaN). "
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "bf304368",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2016-05-01 00:05:00\n",
"File csv_cookbook_data/ams1.csv has missing time steps, reindexing\n",
"ams1 has 0 % missing values\n",
"2016-05-01 00:05:00\n",
"ams2 has 100 % missing values\n",
"2016-05-01 17:30:00\n",
"ams3 has 4 % missing values\n",
"2016-05-01 00:05:00\n",
"ams4 has 1 % missing values\n",
"2016-05-01 00:05:00\n",
"ams5 has 100 % missing values\n",
"2016-05-01 00:05:00\n",
"ams6 has 4 % missing values\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"2016-05-01 00:05:00\n",
"ams7 has 100 % missing values\n",
"2016-05-01 00:05:00\n",
"ams8 has 100 % missing values\n",
"2016-05-01 00:05:00\n",
"ams9 has 100 % missing values\n"
]
}
],
"source": [
"ds_list = []\n",
"for _, metadata_row in pws_meta.iterrows():\n",
" fn = f\"csv_cookbook_data/{metadata_row.ID}.csv\"\n",
" pws_data = pd.read_csv(fn, index_col=0, parse_dates=True, sep=\",\")\n",
" print(pws_data.index[0]) # noqa: T201\n",
"\n",
" duplicate_ix = pws_data.index.duplicated(keep=False).sum()\n",
" if duplicate_ix > 0:\n",
" print(str(duplicate_ix) + \" duplicate indices in file \" + metadata_row.ID) # noqa: T201\n",
" pws_data = pws_data[~pws_data.index.duplicated(keep=\"last\")]\n",
"\n",
" # check if timestamps are complete\n",
" # PWS ams1 has single timestamps with missing data,\n",
" # PWS ams2, ams6 and ams7 have empty timestemps (which corresponds to NaN).\n",
" reindex_timestamps(pws_data)\n",
"\n",
" # replace values smaller than 0 with np.nan\n",
" # This is relevant if PWS have numerical values (e.g. -9999) for NaN\n",
" pws_data[pws_data < 0] = np.nan\n",
"\n",
" print( # noqa: T201\n",
" metadata_row.ID,\n",
" \"has\",\n",
" int(pws_data.isnull().sum()[0] / pws_data.index.shape[0] * 100), # noqa: PD003\n",
" \"% missing values\",\n",
" )\n",
"\n",
" # The follwoing lines convert the data to array and add the attributes\n",
" # accoding to the OpenSense naming conventions\n",
" ds = dataframe_to_dataset(pws_data, metadata_row.lon, metadata_row.lat)\n",
" ds_list.append(ds)"
]
},
{
"cell_type": "markdown",
"id": "f18336bc-b937-4a9a-91d4-5e5516713c8e",
"metadata": {},
"source": [
"### Concatenate all individual `xarray.Datasets` to one `xarray.Dataset` with all stations"
]
},
{
"cell_type": "markdown",
"id": "f6ba8f4d-ad9c-4dd8-be82-26a530b58b3b",
"metadata": {},
"source": [
"PWS ams8 and ams9 have identical coordinates. These stations will be removed using the fuction defined above when creating one `xarray.Dataset` with all stations "
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "9c8b9d12-996b-413a-9c06-42d5cd7069bc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset has 2 PWS with identical lat/lon coordinates\n"
]
}
],
"source": [
"# write list to one netCDF file\n",
"ds_all = xr.concat(ds_list, dim=\"id\")\n",
"\n",
"# remove PWS with duplicate coordinates from xarray.Dataset\n",
"duplicates = get_duplicate_coordinates(ds_all, lat=\"lat\", lon=\"lon\")\n",
"ds_all = ds_all.sel(id=~duplicates.to_numpy())\n",
"print(\"Dataset has\", duplicates.sum(), \"PWS with identical lat/lon coordinates\") # noqa: T201"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "6061bcf6-51fe-4e6e-95a8-2f615030f19a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
"
<xarray.Dataset>\n",
"Dimensions: (time: 2879, id: 7)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 2016-05-01T00:05:00 ... 2016-05-10T23:55:00\n",
" * id (id) object 'ams1' 'ams2' 'ams3' 'ams4' 'ams5' 'ams6' 'ams7'\n",
" elevation (id) object nan nan nan nan nan nan nan\n",
" lon (id) float64 4.671 4.675 4.677 4.678 4.679 4.679 4.679\n",
" lat (id) float64 52.31 52.3 52.31 52.35 52.32 52.3 52.3\n",
"Data variables:\n",
" rainfall (id, time) float64 0.0 0.0 0.0 0.0 0.0 ... nan nan nan nan nan\n",
"Attributes:\n",
" title: PWS data from Amsterdam\n",
" institution: Wageningen University and Research, Department of ...\n",
" history: Subset of the orignal PWS dataset from de Vos et a...\n",
" references: https://doi.org/10.1029/2019GL083731\n",
" date_created: 2024-06-20 17:08:03\n",
" Conventions: OpenSense-0.1\n",
" license restrictions: CC-BY 4.0 https://creativecommons.org/licenses/by/...\n",
" location: Amsterdam (NL)\n",
" source: Netatmo PWS\n",
" comment: Dimensions:
Coordinates: (5)
time
(time)
datetime64[ns]
2016-05-01T00:05:00 ... 2016-05-...
unit : seconds since 1970-01-01 00:00:00 array(['2016-05-01T00:05:00.000000000', '2016-05-01T00:10:00.000000000',\n",
" '2016-05-01T00:15:00.000000000', ..., '2016-05-10T23:45:00.000000000',\n",
" '2016-05-10T23:50:00.000000000', '2016-05-10T23:55:00.000000000'],\n",
" dtype='datetime64[ns]') id
(id)
object
'ams1' 'ams2' ... 'ams6' 'ams7'
array(['ams1', 'ams2', 'ams3', 'ams4', 'ams5', 'ams6', 'ams7'], dtype=object) elevation
(id)
object
nan nan nan nan nan nan nan
units : meters longname : meters_above_sea array([nan, nan, nan, nan, nan, nan, nan], dtype=object) lon
(id)
float64
4.671 4.675 4.677 ... 4.679 4.679
units : degrees in WGS84 projection array([4.670664 , 4.67494 , 4.677275 , 4.6775537, 4.6785928, 4.678602 ,\n",
" 4.678811 ]) lat
(id)
float64
52.31 52.3 52.31 ... 52.3 52.3
units : degrees in WGS84 projection array([52.305896 , 52.302044 , 52.308427 , 52.3460125, 52.3185718,\n",
" 52.29778 , 52.296925 ]) Data variables: (1)
Indexes: (2)
PandasIndex
PandasIndex(DatetimeIndex(['2016-05-01 00:05:00', '2016-05-01 00:10:00',\n",
" '2016-05-01 00:15:00', '2016-05-01 00:20:00',\n",
" '2016-05-01 00:25:00', '2016-05-01 00:30:00',\n",
" '2016-05-01 00:35:00', '2016-05-01 00:40:00',\n",
" '2016-05-01 00:45:00', '2016-05-01 00:50:00',\n",
" ...\n",
" '2016-05-10 23:10:00', '2016-05-10 23:15:00',\n",
" '2016-05-10 23:20:00', '2016-05-10 23:25:00',\n",
" '2016-05-10 23:30:00', '2016-05-10 23:35:00',\n",
" '2016-05-10 23:40:00', '2016-05-10 23:45:00',\n",
" '2016-05-10 23:50:00', '2016-05-10 23:55:00'],\n",
" dtype='datetime64[ns]', name='time', length=2879, freq='5T')) PandasIndex
PandasIndex(Index(['ams1', 'ams2', 'ams3', 'ams4', 'ams5', 'ams6', 'ams7'], dtype='object', name='id')) Attributes: (10)
title : PWS data from Amsterdam institution : Wageningen University and Research, Department of Environmental Sciences history : Subset of the orignal PWS dataset from de Vos et al. (2019) references : https://doi.org/10.1029/2019GL083731 date_created : 2024-06-20 17:08:03 Conventions : OpenSense-0.1 license restrictions : CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ location : Amsterdam (NL) source : Netatmo PWS comment : "
],
"text/plain": [
"\n",
"Dimensions: (time: 2879, id: 7)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 2016-05-01T00:05:00 ... 2016-05-10T23:55:00\n",
" * id (id) object 'ams1' 'ams2' 'ams3' 'ams4' 'ams5' 'ams6' 'ams7'\n",
" elevation (id) object nan nan nan nan nan nan nan\n",
" lon (id) float64 4.671 4.675 4.677 4.678 4.679 4.679 4.679\n",
" lat (id) float64 52.31 52.3 52.31 52.35 52.32 52.3 52.3\n",
"Data variables:\n",
" rainfall (id, time) float64 0.0 0.0 0.0 0.0 0.0 ... nan nan nan nan nan\n",
"Attributes:\n",
" title: PWS data from Amsterdam\n",
" institution: Wageningen University and Research, Department of ...\n",
" history: Subset of the orignal PWS dataset from de Vos et a...\n",
" references: https://doi.org/10.1029/2019GL083731\n",
" date_created: 2024-06-20 17:08:03\n",
" Conventions: OpenSense-0.1\n",
" license restrictions: CC-BY 4.0 https://creativecommons.org/licenses/by/...\n",
" location: Amsterdam (NL)\n",
" source: Netatmo PWS\n",
" comment: "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds_all"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "97000bcf-78ea-44c4-8347-e55299b387a9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Pl7nzp2r5Urrvytdi4KCAg0YMEB/+ctfarmyWmagRk2YMMG48847jejoaOOll15ybH/55ZeNmJgY48477zQmTJhgGIZhvPfee0b//v2NwMBAo0mTJsawYcOMgwcPOl5z0003GYmJiU77z8nJMTw8PIwPPvigVs6nPurTp4/T+2qz2Yzw8HBjwYIFl2y/bt06w9PT0ygpKamtEhuMql6Lr776ypDk9HOCq1eZ6/Dll18a1113nXHs2DFDkrF+/XoTKq3/rnQtBg0aZMyYMcOk6hqWK12Lvn37GnPnzjWrvAajqv9OdOvWzZg0aVJtldegXOla+Pn5GS+88ILTa5o0aWIsW7asVutsCCq6Fu+//75htVqN3Nxcx/OnT582LBaLsWHDBjPKbRB+/reR3W43QkNDjb/+9a+ObadPnza8vLyMV155xYQKG46K/k7NysoyJBlffvllrdZUW/h66RqZNGmSUlNTHY9XrFihiRMnOrUpKChQcnKyvvjiC6Wnp8tqtWrUqFGOVH3KlClavXq1ioqKHK956aWXdN111+nmm2+unROpZ4qLi7V9+3bFxcU5tlmtVsXFxWnz5s2XfE1ubq4CAgLk7u5eW2U2CFW9FgUFBUpNTVVUVJRatmxZm6XWa5W5DoWFhRo3bpyeeeYZhYaGmlVqvVfZn4mXX35ZTZs2VXR0tObMmaPCwkIzyq3XrnQtcnJytGXLFjVv3lw33HCDQkJCNGjQIG3atMnEquufqv47sX37du3cuZPettdAZa7FDTfcoLVr1+qHH36Q3W7XmjVrdO7cOQ0ePNikquunK12LoqIiWSwWeXl5OZ739vaW1Wrld1QtysrK0vHjx52uU2BgoPr27XvZzxzA1SLcuUbuvfdebdq0SUeOHNGRI0f06aef6t5773VqM3r0aN11111q27atunXrphUrVmj37t3au3evJOmuu+6SJL355puO16xcudIxrw+q7uTJk7LZbAoJCXHaHhISouPHj1+y/R/+8AdNnTq1tkpsMCp7Lf75z3/K399f/v7+eu+997RhwwZ5enrWdrn1VmWuw4MPPqgbbrhBd955pxklNhiVuRbjxo3TSy+9pI8++khz5szRiy++eNG/Lbh6V7oW33zzjSRp/vz5uv/++5WWlqYePXrolltuYT6FGlTVf7OXL1+uTp066YYbbqitEhuMylyLdevW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nTIzM/Xyyy8rMjLykudbWlqqkSNHatCgQdq1a5c2b96sqVOnVtiT6qOPPtKhQ4f00UcfOXqpXPiHXkXvwenTp3XzzTere/fu+uKLL5SWlqYTJ05ozJgxlbtAl1FUVCRvb2+nbT4+Ptq6datT8HSh5cuX61e/+pX8/PwkSVlZWTp+/LjTH86BgYHq27dvhX84b968WV26dFFISIhjW3x8vPLy8vTf//632udUXFys7du3O9VjtVoVFxdXpT/kAQB1i91u18yZM9W/f39FR0dLko4fPy5PT8+L5gkMCQnR8ePHK73vb775RkeOHNGrr76qF154QStXrtT27dv1i1/8olKvHz58uPLy8vTxxx+roKBA69at06RJky5qd/PNN+vee+9Vx44d1alTJy1dulSFhYXauHGjpLJh+R06dNCLL77oeE1qaqp++ctfOv5mqAz3SrcEAAA1IjAwUJ6envL19b1s74tyJSUlWrJkidq0aSNJ+sUvfqEXX3xRJ06ckL+/vzp37qybbrpJH330ke6++25lZ2crNTVV2dnZCg8Pl1Q2V0xaWppSU1P1pz/9qdJ1Zmdn66GHHlLHjh0lSe3atXM8t2DBAt1zzz2O+VLatWunxYsXa9CgQVqyZImys7O1bt06bdiwwfGB/MJu0f/85z/VsmVLPf3007JYLOrYsaOOHj2qRx55RCkpKbJay75/iomJ0bx58xzHePrpp5Wenq4hQ4bogw8+0L59+/T+++87zvVPf/qThg4d6nQO7dq104ABA2SxWBQREXHZ883Ly1Nubq6GDx/ueL87depU4XvUuHFjPf3003Jzc1PHjh01bNgwpaen6/7779f+/fsrfA+efvppde/e3emarFixQi1bttT+/fvVvn37Co99OfHx8Xr++ec1cuRI9ejRQ9u3b9fzzz+vkpISnTx5UmFhYU7tt27dqj179jj1KCr/4/jCkKb8cUV/OB8/fvySr7lwn9Vx8uRJ2Wy2S+5737591d4vAMC1JSYmas+ePdq0aVON79tut6uoqEgvvPCC49/c5cuXq2fPnsrMzJSPj486d+7saP+73/3Oadivh4eH7r33XqWmpuqbb75R+/btFRMTc9FxTpw4oblz5yojI0M5OTmy2WwqLCxUdna2o82UKVO0dOlSPfzwwzpx4oTee+89ffjhh1U6H8IdAABcmK+vryNokMo+zEZGRjp9kxMSEuKYd2T37t2y2WwXBQNFRUVVni8mOTlZU6ZM0Ysvvqi4uDj98pe/dNTy1VdfadeuXXr55Zcd7Q3DkN1uV1ZWlnbv3i03NzcNGjTokvv++uuvFRsb69Qrpn///srPz9d3333nmIzw538khYWFOc7166+/VsuWLR3BjiTFxsY6tU9ISNCQIUPUoUMH3XbbbRo+fLhuvfXWS9bUpEkTJSQkKD4+XkOGDFFcXJzGjBlzURhyoeuvv15ubm5O9e3evVuStHPnzgrfg6+++kofffTRJb+VO3ToULXDnd///vc6fvy4+vXrJ8MwFBISogkTJuiJJ55whGYXWr58ubp06VKpCSQvNHToUH3yySeSpIiIiKvqmXOhTz75xCmge+6553TTTTfVyL4BAHXH9OnT9c477+jjjz9WixYtHNtDQ0NVXFys06dPO/XeOXHixBW/NLtQWFiY3N3dnf69Lf9SJzs7WzfddJN27tzpeK58WNiFJk2apL59+2rPnj2X7LUjSRMmTNCpU6e0aNEiRUREyMvLS7GxsY7hylJZT9/Zs2dr8+bN+uyzzxQVFaWBAwdW+lwkwh0AAFxa+TCochaL5ZLb7Ha7JCk/P19ubm7avn27U+ggqUpde6WyOWbGjRunf//733rvvfc0b948rVmzRqNGjVJ+fr6mTZumpKSki17XqlUrHTx4sErHupyKzrUyevTooaysLL333nv64IMPNGbMGMXFxTkNY7tQamqqkpKSlJaWprVr12ru3LnasGHDZedwqag+Hx+fCmvLz8/XiBEjnObCKVdRoHQlPj4+WrFihZ577jmdOHFCYWFhWrp0qRo1aqRmzZo5tS0oKNCaNWv02GOPOW0v/+O4/PXlTpw44Zh36Pnnn9fZs2cl/fQ+hIaGXrSCVfnStJX9g7tXr15Of0yHhITIy8tLbm5uFy1zW9U/5AEArs8wDD3wwANav369MjIyFBUV5fR8z5495eHhofT0dI0ePVqSlJmZqezs7Iu+5KlI//79VVpaqkOHDjm+vCpfNTQiIkLu7u5q27Zthfu4/vrrdf3112vXrl0aN27cJdt8+umn+uc//6nbb79dkvTtt99eNL9ecHCwRo4cqdTUVG3evFkTJ06s9HmUI9wBAMAEnp6eTpMg15Tu3bvLZrMpJyenyt/4XEr79u3Vvn17Pfjggxo7dqxSU1M1atQo9ejRQ3v37r3sHz1dunSR3W7Xxo0bL7mqU6dOnfTaa6/JMAxH751PP/1UjRo1cvp2riKdOnXSt99+q2PHjjkCiAtXySgXEBCgu+++W3fffbd+8Ytf6LbbbtMPP/xwyW/gpLL3sHv37pozZ45iY2O1evXqak3Qe6X3oEePHnrttdcUGRkpd/ea/5PMw8PD8V6uWbNGw4cPv6jnzquvvqqioiLde++9TtujoqIUGhqq9PR0R5iTl5enLVu26De/+Y0k6brrrrvomLGxsfrjH/+onJwcx8prGzZsUEBAgFPX9or4+Phc8v+rnj17Kj093bH8u91uV3p6utM8TwCAui8xMVGrV6/Wm2++qUaNGjmG9QYGBsrHx0eBgYGaPHmykpOT1aRJEwUEBOiBBx5QbGys07/XBw8eVH5+vo4fP66zZ886vjjo3LmzPD09FRcXpx49emjSpElauHCh7Ha7EhMTNWTIkCr1nv3www9VUlJy0RxA5dq1a6cXX3xRvXr1Ul5enh566KFLfgE0ZcoUDR8+XDabTRMmTKj8G3YeEyoDAGCCyMhIbdmyRYcPH9bJkyer1BulIu3bt9c999yj8ePH6/XXX1dWVpa2bt2qBQsW6N///nel93P27FlNnz5dGRkZOnLkiD799FNt27bN0V35kUce0Weffabp06dr586dOnDggN58803HB+3IyEhNmDBBkyZN0htvvKGsrCxlZGRo3bp1kqT/+7//07fffqsHHnhA+/bt05tvvql58+YpOTn5kkOHLiUuLk7t27fXhAkT9NVXX+mTTz7R//t//8+pzd///ne98sor2rdvn/bv369XX31VoaGhl/wDLCsrS3PmzNHmzZt15MgR/ec//9GBAweuOO/O5VzpPUhMTNQPP/ygsWPHatu2bTp06JDef/99TZw4scLgb+/evdq5c6d++OEH5ebmaufOnU49Xfbv36+XXnpJBw4c0NatW/WrX/1Ke/bsueR8S8uXL9fIkSMvGrJnsVg0c+ZMPf7443rrrbe0e/dujR8/XuHh4Y5w5VJuvfVWde7cWffdd5+++uorvf/++5o7d64SExPl5eXlaFdec35+vr7//nvt3LlTe/furfD9TE5O1rJly7Rq1Sp9/fXX+s1vfqOCggKnbzePHz+unTt3OnqO7d692/FeAQDqhiVLlig3N1eDBw9WWFiY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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ds_all.rainfall.cumsum(dim=\"time\").plot.line(x=\"time\", figsize=(14, 4));"
]
},
{
"cell_type": "markdown",
"id": "944316d8-16ba-4466-a1b0-f634bebd2dcf",
"metadata": {},
"source": [
"### Save data to compressed NetCDF"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "852e4488-1241-40c5-a044-634e616066e2",
"metadata": {},
"outputs": [],
"source": [
"# add enconoding to compress the file\n",
"myencoding = {\n",
" \"rainfall\": {\n",
" \"dtype\": \"int32\",\n",
" \"scale_factor\": 0.001,\n",
" \"zlib\": True,\n",
" \"_FillValue\": -9999,\n",
" \"complevel\": 3,\n",
" }\n",
"}\n",
"\n",
"ds_all.to_netcdf(\"AMS_PWS_subset.nc\", encoding=myencoding)"
]
},
{
"cell_type": "markdown",
"id": "e57f44cd-697f-4e67-b951-7306dc91d69d",
"metadata": {},
"source": [
"## CML data"
]
},
{
"cell_type": "markdown",
"id": "dbe899b4-9567-4f81-a2c9-80d6f5538c2b",
"metadata": {},
"source": [
"### to be added..."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "101ebb47-d490-4384-95db-1f0a42b48d8a",
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}