{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "03b97c26-f442-46c8-a718-fe69b2a99bf8", "metadata": {}, "source": [ "# Waterwebservices: POST-requests versus ddlpy\n", "\n", "The Rijkswaterstaat WADAR Waterwebservices provide access to almost all measurement data collected by Rijkswaterstaat. Users can send HTTP POST requests to retrieve specific (meta)data from the https://ddapi20-waterwebservices.rijkswaterstaat.nl API. There are five public endpoints:\n", "* `/METADATASERVICES/OphalenCatalogus`\n", "* `/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen`\n", "* `/ONLINEWAARNEMINGENSERVICES/OphalenLaatsteWaarnemingen`\n", "* `/ONLINEWAARNEMINGENSERVICES/CheckWaarnemingenAanwezig`\n", "* `/ONLINEWAARNEMINGENSERVICES/OphalenAantalWaarnemingen`\n", "\n", "The new RWS Waterwebservices are available since 5 December 2025. They are documented on https://rijkswaterstaatdata.nl/waterdata. This page also contains a link to documentation about migrating from the old to the new Waterwebservices ([\"overschakel-documentatie\"](https://rijkswaterstaatdata.nl/projecten/waterwebservices-overschakeling)), which in turn contains a link to the [RWS webinar Waterdata](https://www.youtube.com/watch?v=T5jkHv7PFaA). On the Waterwebservices Github, users can [post questions/discussions](https://github.com/Rijkswaterstaat/WaterWebservices/discussions) or [report issues/bugs](https://github.com/Rijkswaterstaat/WaterWebservices/issues). Any issues with the actual (meta)data can also be reported via the [RWS Servicedesk Data](https://www.rijkswaterstaat.nl/formulieren/contactformulier-servicedesk-data).\n", "\n", "The Python toolbox [ddlpy](https://github.com/Deltares/ddlpy) is a simple wrapper around the Waterwebservices, which simplifies the interaction with the Waterwebservices. It it useful for:\n", "* Easy filtering/subsetting of available data and stations\n", "* Retrieving data/metadata from the new RWS Waterwebservices\n", "* Automatically chunking your large data requests\n", "* Conversion to pandas and xarray datasets\n", "* Error handling: knowing why your request fails\n", "\n", "This notebook provides some examples of POST-requests and responses, followed by the ddlpy alternatives.\n" ] }, { "cell_type": "markdown", "id": "bab968fe-9511-429b-b64d-7c8e705bd583", "metadata": {}, "source": [ "## POST-requests: retrieving the catalog\n", "\n", "The `/METADATASERVICES/OphalenCatalogus` endpoint provides metadata, for instance:\n", "* `LocatieLijst`: a list of locations\n", "* `AquoMetadataLijst`: a list of metadata\n", "* `AquoMetadataLocatieLijst`: a list of location-metadata combinations\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "07507a0f-94f9-4b2f-8258-18e05ed0ed95", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available keys in the response:\n", "dict_keys(['Succesvol', 'AquoMetadataLijst', 'AquoMetadataLocatieLijst', 'BemonsteringshoogteLijst', 'LocatieLijst', 'OpdrachtgevendeInstantieLijst', 'ReferentievlakLijst', 'StatuswaardeLijst'])\n" ] } ], "source": [ "# imports\n", "import requests\n", "import pandas as pd\n", "\n", "# retrieve the catalog (takes approximately 30 seconds)\n", "url = \"https://ddapi20-waterwebservices.rijkswaterstaat.nl/METADATASERVICES/OphalenCatalogus\"\n", "req = {\n", " \"CatalogusFilter\": {\n", " \"Eenheden\": True, \n", " \"Grootheden\": True, \n", " \"Hoedanigheden\": True, \n", " \"Groeperingen\": True, \n", " \"Parameters\": True, \n", " \"Typeringen\": True, \n", " \"ProcesTypes\": True, \n", " \"Compartimenten\": True\n", " }\n", "}\n", "resp = requests.post(url=url, json=req)\n", "result_cat = resp.json()\n", "print(\"Available keys in the response:\")\n", "print(result_cat.keys())\n" ] }, { "cell_type": "markdown", "id": "d4b3ab84-bfe3-41d3-9ac0-b0507f5b8ca3", "metadata": {}, "source": [ "The `LocatieLijst` contains information like name/coordinates/ID of all the locations for which measurements are available in the Waterwebservices." ] }, { "cell_type": "code", "execution_count": 2, "id": "c60dfd97-6db3-4860-bcc0-9c28c593f102", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LocatieLijst raw output (first few entries):\n", "[{'Code': '4epetroleumhaven', 'Lat': 51.953524, 'Lon': 4.140491, 'Coordinatenstelsel': 'ETRS89', 'Naam': '4e Petroleumhaven', 'Omschrijving': '4e Petroleumhaven', 'Locatie_MessageID': 10603}, {'Code': '7epetroleumhaven', 'Lat': 51.915615, 'Lon': 4.21277, 'Coordinatenstelsel': 'ETRS89', 'Naam': '7e Petroleumhaven', 'Omschrijving': '7e Petroleumhaven', 'Locatie_MessageID': 17056}] [...]\n", "\n", "LocatieLijst pandas DataFrame:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CodeLatLonCoordinatenstelselNaamOmschrijvingLocatie_MessageID
04epetroleumhaven51.9535244.140491ETRS894e Petroleumhaven4e Petroleumhaven10603
17epetroleumhaven51.9156154.212770ETRS897e Petroleumhaven7e Petroleumhaven17056
2a1255.3833333.800000ETRS89A12platform3627
3aadorp52.3726006.633300ETRS89AadorpAadorp11036
4aa.helmond51.4887635.682549ETRS89Aa, HelmondAa, Helmond2303
........................
2432zwolle52.5230476.069995ETRS89ZwolleHasselterhaven, Zwarte Water16580
2433zwolle.ijssel52.5086006.053000ETRS89Zwolle, IJsselvoorheen Katerveer144
2434zwolle.zwartewater.kanaal52.5098316.054957ETRS89Zwolle, Zwarte Water, kanaalvoorheen Spooldersluis binnen1489
2435zwolsehoek.badstrand52.6153865.653051ETRS89Zwolse Hoek, badstrandZwolse Hoek, badstrand10007
2436zwolsehoek.badstrand.252.6148175.654509ETRS89Zwolse Hoek, badstrand, 2Zwolse Hoek, badstrand, 23857
\n", "

2437 rows × 7 columns

\n", "
" ], "text/plain": [ " Code Lat Lon Coordinatenstelsel \\\n", "0 4epetroleumhaven 51.953524 4.140491 ETRS89 \n", "1 7epetroleumhaven 51.915615 4.212770 ETRS89 \n", "2 a12 55.383333 3.800000 ETRS89 \n", "3 aadorp 52.372600 6.633300 ETRS89 \n", "4 aa.helmond 51.488763 5.682549 ETRS89 \n", "... ... ... ... ... \n", "2432 zwolle 52.523047 6.069995 ETRS89 \n", "2433 zwolle.ijssel 52.508600 6.053000 ETRS89 \n", "2434 zwolle.zwartewater.kanaal 52.509831 6.054957 ETRS89 \n", "2435 zwolsehoek.badstrand 52.615386 5.653051 ETRS89 \n", "2436 zwolsehoek.badstrand.2 52.614817 5.654509 ETRS89 \n", "\n", " Naam Omschrijving \\\n", "0 4e Petroleumhaven 4e Petroleumhaven \n", "1 7e Petroleumhaven 7e Petroleumhaven \n", "2 A12 platform \n", "3 Aadorp Aadorp \n", "4 Aa, Helmond Aa, Helmond \n", "... ... ... \n", "2432 Zwolle Hasselterhaven, Zwarte Water \n", "2433 Zwolle, IJssel voorheen Katerveer \n", "2434 Zwolle, Zwarte Water, kanaal voorheen Spooldersluis binnen \n", "2435 Zwolse Hoek, badstrand Zwolse Hoek, badstrand \n", "2436 Zwolse Hoek, badstrand, 2 Zwolse Hoek, badstrand, 2 \n", "\n", " Locatie_MessageID \n", "0 10603 \n", "1 17056 \n", "2 3627 \n", "3 11036 \n", "4 2303 \n", "... ... \n", "2432 16580 \n", "2433 144 \n", "2434 1489 \n", "2435 10007 \n", "2436 3857 \n", "\n", "[2437 rows x 7 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get all dataframes from the response\n", "print(\"LocatieLijst raw output (first few entries):\")\n", "print(result_cat[\"LocatieLijst\"][:2], \"[...]\")\n", "print()\n", "print(\"LocatieLijst pandas DataFrame:\")\n", "df_LocatieLijst = pd.DataFrame(result_cat[\"LocatieLijst\"])\n", "# print the list of available locations\n", "df_LocatieLijst\n" ] }, { "cell_type": "markdown", "id": "717fe000-2c9f-4344-849a-cf8c2e94e325", "metadata": {}, "source": [ "The `AquoMetadataLijst` contains metadata for all the parameters available in the Waterwebservices. After converting the response to a `pandas.DataFrame()` with `pd.json_normalize()`, the response is a `DataFrame` with the following columns:\n", "* Combination of `*.Code` and `*.Omschrijving` columns for all parameters in `CatalogusFilter` provided in the POST request\n", "* `Parameter_Wat_Omschrijving` is a readable description of what is measured, a combination of several other \".Omschrijving\" columns\n", "* `AquoMetadata_MessageID` is a unique identifier of the metadata entry." ] }, { "cell_type": "code", "execution_count": 3, "id": "ed0ae657-f9c7-4894-b2fd-8a271af10b20", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AquoMetadataLijst raw output (first few entries):\n", "[{'Compartiment': {'Code': 'OW', 'Omschrijving': 'Oppervlaktewater'}, 'Grootheid': {'Code': '50%_L', 'Omschrijving': '50 percentiel van de levendigheid'}, 'Eenheid': {'Code': 'cm2', 'Omschrijving': 'vierkante centimeter'}, 'Hoedanigheid': {'Code': 'NVT', 'Omschrijving': 'NVT'}, 'Parameter': {'Code': 'NVT', 'Omschrijving': 'NVT'}, 'Groepering': {'Code': 'LEVDHD5', 'Omschrijving': 'Levendigheid'}, 'Typering': {'Code': 'LEVDHD', 'Omschrijving': 'Levendigheid'}, 'Parameter_Wat_Omschrijving': 'Percentielen per etmaal Levendigheid 50 percentiel van de levendigheid in Oppervlaktewater in cm2', 'ProcesType': 'meting', 'AquoMetadata_MessageID': 569}] [...]\n", "\n", "AquoMetadataLijst pandas DataFrame:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Parameter_Wat_OmschrijvingProcesTypeAquoMetadata_MessageIDCompartiment.CodeCompartiment.OmschrijvingGrootheid.CodeGrootheid.OmschrijvingEenheid.CodeEenheid.OmschrijvingHoedanigheid.CodeHoedanigheid.OmschrijvingParameter.CodeParameter.OmschrijvingGroepering.CodeGroepering.OmschrijvingTypering.CodeTypering.Omschrijving
0Percentielen per etmaal Levendigheid 50 percen...meting569OWOppervlaktewater50%_L50 percentiel van de levendigheidcm2vierkante centimeterNVTNVTNVTNVTLEVDHD5LevendigheidLEVDHDLevendigheid
1Percentielen per etmaal Levendigheid 70 percen...meting1415OWOppervlaktewater70%_L70 percentiel van de levendigheidcm2vierkante centimeterNVTNVTNVTNVTLEVDHD5LevendigheidLEVDHDLevendigheid
2Percentielen per etmaal Levendigheid 80 percen...meting1045OWOppervlaktewater80%_L80 percentiel van de levendigheidcm2vierkante centimeterNVTNVTNVTNVTLEVDHD5LevendigheidLEVDHDLevendigheid
3Percentielen per etmaal Levendigheid 90 percen...meting1734OWOppervlaktewater90%_L90 percentiel van de levendigheidcm2vierkante centimeterNVTNVTNVTNVTLEVDHD5LevendigheidLEVDHDLevendigheid
4Aantal Plastic deeltjes, herkomst industrie (p...meting772OEOrganisme (biota)AANTLAantalDIMSLSdimensieloosNVTNVTOSPAR_PLAINDPlastic deeltjes, herkomst industrie (plastic ...OSPAR_PLAIND_VOVPlastic deeltjes bron industrie(granulaat) onv...NVTNVT
......................................................
20421' scalair gemiddelde van de windsnelheid in L...meting514LTLuchtWS11' scalair gemiddelde van de windsnelheidm/smeter per secondeNVTNVTNVTNVTNVTNVT
204310' scalair genmiddelde van de windsnelheid in...meting1857LTLuchtWS1010' scalair genmiddelde van de windsnelheidm/smeter per secondeNVTNVTNVTNVTNVTNVT
204410' scalair genmiddelde van de windsnelheid in...meting385LTLuchtWS1010' scalair genmiddelde van de windsnelheidm/smeter per secondeNVTNVTNVTNVTWS10STD2mux van WS10 en WS10STDNVTNVT
2045Doorzicht in Oppervlaktewater in dmmeting1988OWOppervlaktewaterZICHTDoorzichtdmdecimeterNVTNVTNVTNVTNVTNVT
2046Doorzicht in Lucht in mmeting124LTLuchtZICHTDoorzichtmmeterNVTNVTNVTNVTNVTNVT
\n", "

2047 rows × 17 columns

\n", "
" ], "text/plain": [ " Parameter_Wat_Omschrijving ProcesType \\\n", "0 Percentielen per etmaal Levendigheid 50 percen... meting \n", "1 Percentielen per etmaal Levendigheid 70 percen... meting \n", "2 Percentielen per etmaal Levendigheid 80 percen... meting \n", "3 Percentielen per etmaal Levendigheid 90 percen... meting \n", "4 Aantal Plastic deeltjes, herkomst industrie (p... meting \n", "... ... ... \n", "2042 1' scalair gemiddelde van de windsnelheid in L... meting \n", "2043 10' scalair genmiddelde van de windsnelheid in... meting \n", "2044 10' scalair genmiddelde van de windsnelheid in... meting \n", "2045 Doorzicht in Oppervlaktewater in dm meting \n", "2046 Doorzicht in Lucht in m meting \n", "\n", " AquoMetadata_MessageID Compartiment.Code Compartiment.Omschrijving \\\n", "0 569 OW Oppervlaktewater \n", "1 1415 OW Oppervlaktewater \n", "2 1045 OW Oppervlaktewater \n", "3 1734 OW Oppervlaktewater \n", "4 772 OE Organisme (biota) \n", "... ... ... ... \n", "2042 514 LT Lucht \n", "2043 1857 LT Lucht \n", "2044 385 LT Lucht \n", "2045 1988 OW Oppervlaktewater \n", "2046 124 LT Lucht \n", "\n", " Grootheid.Code Grootheid.Omschrijving Eenheid.Code \\\n", "0 50%_L 50 percentiel van de levendigheid cm2 \n", "1 70%_L 70 percentiel van de levendigheid cm2 \n", "2 80%_L 80 percentiel van de levendigheid cm2 \n", "3 90%_L 90 percentiel van de levendigheid cm2 \n", "4 AANTL Aantal DIMSLS \n", "... ... ... ... \n", "2042 WS1 1' scalair gemiddelde van de windsnelheid m/s \n", "2043 WS10 10' scalair genmiddelde van de windsnelheid m/s \n", "2044 WS10 10' scalair genmiddelde van de windsnelheid m/s \n", "2045 ZICHT Doorzicht dm \n", "2046 ZICHT Doorzicht m \n", "\n", " Eenheid.Omschrijving Hoedanigheid.Code Hoedanigheid.Omschrijving \\\n", "0 vierkante centimeter NVT NVT \n", "1 vierkante centimeter NVT NVT \n", "2 vierkante centimeter NVT NVT \n", "3 vierkante centimeter NVT NVT \n", "4 dimensieloos NVT NVT \n", "... ... ... ... \n", "2042 meter per seconde NVT NVT \n", "2043 meter per seconde NVT NVT \n", "2044 meter per seconde NVT NVT \n", "2045 decimeter NVT NVT \n", "2046 meter NVT NVT \n", "\n", " Parameter.Code Parameter.Omschrijving \\\n", "0 NVT NVT \n", "1 NVT NVT \n", "2 NVT NVT \n", "3 NVT NVT \n", "4 OSPAR_PLAIND Plastic deeltjes, herkomst industrie (plastic ... \n", "... ... ... \n", "2042 NVT NVT \n", "2043 NVT NVT \n", "2044 NVT NVT \n", "2045 NVT NVT \n", "2046 NVT NVT \n", "\n", " Groepering.Code Groepering.Omschrijving \\\n", "0 LEVDHD5 Levendigheid \n", "1 LEVDHD5 Levendigheid \n", "2 LEVDHD5 Levendigheid \n", "3 LEVDHD5 Levendigheid \n", "4 OSPAR_PLAIND_VOV Plastic deeltjes bron industrie(granulaat) onv... \n", "... ... ... \n", "2042 \n", "2043 \n", "2044 WS10STD2 mux van WS10 en WS10STD \n", "2045 \n", "2046 \n", "\n", " Typering.Code Typering.Omschrijving \n", "0 LEVDHD Levendigheid \n", "1 LEVDHD Levendigheid \n", "2 LEVDHD Levendigheid \n", "3 LEVDHD Levendigheid \n", "4 NVT NVT \n", "... ... ... \n", "2042 NVT NVT \n", "2043 NVT NVT \n", "2044 NVT NVT \n", "2045 NVT NVT \n", "2046 NVT NVT \n", "\n", "[2047 rows x 17 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"AquoMetadataLijst raw output (first few entries):\")\n", "print(result_cat[\"AquoMetadataLijst\"][:1], \"[...]\")\n", "print()\n", "print(\"AquoMetadataLijst pandas DataFrame:\")\n", "df_AquoMetadataLijst = pd.json_normalize(result_cat[\"AquoMetadataLijst\"])\n", "# print the list of available metadata\n", "df_AquoMetadataLijst\n" ] }, { "cell_type": "markdown", "id": "d1d05cdd-b185-412e-aaa7-e463c00e3c43", "metadata": {}, "source": [ "The `AquoMetadataLocatieLijst` is a list of metadata-location-combinations. It contains the `AquoMetadata_MessageID` from `AquoMetadataLijst` and `Locatie_MessageID` from `LocatieLijst`." ] }, { "cell_type": "code", "execution_count": 4, "id": "c97779f4-2ec4-4426-8efd-72c87b2720d8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AquoMetadataLocatieLijst raw output (first few entries):\n", "[{'AquoMetaData_MessageID': 1312, 'Locatie_MessageID': 16287}, {'AquoMetaData_MessageID': 1742, 'Locatie_MessageID': 11210}, {'AquoMetaData_MessageID': 1957, 'Locatie_MessageID': 12815}, {'AquoMetaData_MessageID': 889, 'Locatie_MessageID': 10578}, {'AquoMetaData_MessageID': 289, 'Locatie_MessageID': 1635}, {'AquoMetaData_MessageID': 512, 'Locatie_MessageID': 6068}] [...]\n", "\n", "AquoMetadataLocatieLijst pandas DataFrame:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AquoMetaData_MessageIDLocatie_MessageID
0131216287
1174211210
2195712815
388910578
42891635
.........
9752862516226
9752918144119
97530111312035
9753195598
97532120617485
\n", "

97533 rows × 2 columns

\n", "
" ], "text/plain": [ " AquoMetaData_MessageID Locatie_MessageID\n", "0 1312 16287\n", "1 1742 11210\n", "2 1957 12815\n", "3 889 10578\n", "4 289 1635\n", "... ... ...\n", "97528 625 16226\n", "97529 1814 4119\n", "97530 1113 12035\n", "97531 955 98\n", "97532 1206 17485\n", "\n", "[97533 rows x 2 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"AquoMetadataLocatieLijst raw output (first few entries):\")\n", "print(result_cat[\"AquoMetadataLocatieLijst\"][:6], \"[...]\")\n", "print()\n", "print(\"AquoMetadataLocatieLijst pandas DataFrame:\")\n", "df_AquoMetadataLocatieLijst = pd.DataFrame(result_cat[\"AquoMetadataLocatieLijst\"])\n", "# print the list of location/metadata combinations\n", "df_AquoMetadataLocatieLijst\n" ] }, { "cell_type": "markdown", "id": "35457ca7-1c1a-4546-a32d-7d805a51f0aa", "metadata": {}, "source": [ "## POST-requests: selecting locations/metadata\n", "When combining the information from these three lists, it is possible to retrieve for instance waterlevels for Hoek van Holland:\n", "1. Get the `Locatie_MessageID` from `df_LocatieLijst`\n", "2. Get a list of available `AquoMetaData_MessageID` (metadata) for this `Locatie_MessageID` (location) from `df_AquoMetadataLocatieLijst`\n", "3. Filter the `df_AquoMetadataLijst` based on location, and the desired metadata (for instance water level: `Grootheid.Code==WATHTE`)" ] }, { "cell_type": "code", "execution_count": 5, "id": "7ee01b53-a2ef-4388-af79-3e4c465e7141", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(1319)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# first get the station Locatie_MessageID from df_locations via the station Code\n", "bool_station = df_LocatieLijst[\"Code\"] == 'hoekvanholland'\n", "locatie_messid = df_LocatieLijst.loc[bool_station][\"Locatie_MessageID\"].iloc[0]\n", "# print the location ID for the selected station\n", "locatie_messid" ] }, { "cell_type": "code", "execution_count": 6, "id": "5ffa1a84-efcc-4fc9-807c-4aa574fd6a00", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1675 1863\n", "3143 603\n", "3454 607\n", "3801 388\n", "5864 1328\n", " ... \n", "85105 89\n", "91500 1798\n", "91900 569\n", "95637 1107\n", "97500 626\n", "Name: AquoMetaData_MessageID, Length: 65, dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the available metadata (AquoMetaData_MessageID) for this station from df_AquoMetadataLocatieLijst\n", "bool_station_in_metadatalocation = df_AquoMetadataLocatieLijst[\"Locatie_MessageID\"] == locatie_messid\n", "meta_messid_for_station = df_AquoMetadataLocatieLijst.loc[bool_station_in_metadatalocation][\"AquoMetaData_MessageID\"]\n", "# print the metadata ID's available for the selected station\n", "meta_messid_for_station" ] }, { "cell_type": "code", "execution_count": 7, "id": "3749c6a7-4109-4dd3-b982-cccb12016ba4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Parameter_Wat_OmschrijvingProcesTypeAquoMetadata_MessageIDCompartiment.CodeCompartiment.OmschrijvingGrootheid.CodeGrootheid.OmschrijvingEenheid.CodeEenheid.OmschrijvingHoedanigheid.CodeHoedanigheid.OmschrijvingParameter.CodeParameter.OmschrijvingGroepering.CodeGroepering.OmschrijvingTypering.CodeTypering.Omschrijving
2021Etmaalgemiddelde Waterhoogte in Oppervlaktewat...meting1376OWOppervlaktewaterWATHTEWaterhoogtecmcentimeterNAPt.o.v. Normaal Amsterdams PeilNVTNVTNVTNVT
2025Waterhoogte verwachting in Oppervlaktewater t....verwachting830OWOppervlaktewaterWATHTEWaterhoogtecmcentimeterNAPt.o.v. Normaal Amsterdams PeilNVTNVTNVTNVT
2026Etmaalgemiddelde Waterhoogte in Oppervlaktewat...meting1801OWOppervlaktewaterWATHTEWaterhoogtecmcentimeterNAPt.o.v. Normaal Amsterdams PeilNVTNVTGETETM2GetijextremenNVTNVT
2029Waterhoogte astronomisch in Oppervlaktewater t...astronomisch528OWOppervlaktewaterWATHTEWaterhoogtecmcentimeterNAPt.o.v. Normaal Amsterdams PeilNVTNVTGETETBRKD2Getijextreem berekendNVTNVT
2030Waterhoogte astronomisch in Oppervlaktewater t...astronomisch1355OWOppervlaktewaterWATHTEWaterhoogtecmcentimeterNAPt.o.v. Normaal Amsterdams PeilNVTNVTNVTNVT
\n", "
" ], "text/plain": [ " Parameter_Wat_Omschrijving ProcesType \\\n", "2021 Etmaalgemiddelde Waterhoogte in Oppervlaktewat... meting \n", "2025 Waterhoogte verwachting in Oppervlaktewater t.... verwachting \n", "2026 Etmaalgemiddelde Waterhoogte in Oppervlaktewat... meting \n", "2029 Waterhoogte astronomisch in Oppervlaktewater t... astronomisch \n", "2030 Waterhoogte astronomisch in Oppervlaktewater t... astronomisch \n", "\n", " AquoMetadata_MessageID Compartiment.Code Compartiment.Omschrijving \\\n", "2021 1376 OW Oppervlaktewater \n", "2025 830 OW Oppervlaktewater \n", "2026 1801 OW Oppervlaktewater \n", "2029 528 OW Oppervlaktewater \n", "2030 1355 OW Oppervlaktewater \n", "\n", " Grootheid.Code Grootheid.Omschrijving Eenheid.Code Eenheid.Omschrijving \\\n", "2021 WATHTE Waterhoogte cm centimeter \n", "2025 WATHTE Waterhoogte cm centimeter \n", "2026 WATHTE Waterhoogte cm centimeter \n", "2029 WATHTE Waterhoogte cm centimeter \n", "2030 WATHTE Waterhoogte cm centimeter \n", "\n", " Hoedanigheid.Code Hoedanigheid.Omschrijving Parameter.Code \\\n", "2021 NAP t.o.v. Normaal Amsterdams Peil NVT \n", "2025 NAP t.o.v. Normaal Amsterdams Peil NVT \n", "2026 NAP t.o.v. Normaal Amsterdams Peil NVT \n", "2029 NAP t.o.v. Normaal Amsterdams Peil NVT \n", "2030 NAP t.o.v. Normaal Amsterdams Peil NVT \n", "\n", " Parameter.Omschrijving Groepering.Code Groepering.Omschrijving \\\n", "2021 NVT \n", "2025 NVT \n", "2026 NVT GETETM2 Getijextremen \n", "2029 NVT GETETBRKD2 Getijextreem berekend \n", "2030 NVT \n", "\n", " Typering.Code Typering.Omschrijving \n", "2021 NVT NVT \n", "2025 NVT NVT \n", "2026 NVT NVT \n", "2029 NVT NVT \n", "2030 NVT NVT " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# from those, get the waterhoogte-related metadata (for this station)\n", "bool_meta_for_station = df_AquoMetadataLijst[\"AquoMetadata_MessageID\"].isin(meta_messid_for_station.values)\n", "bool_wathte = df_AquoMetadataLijst[\"Grootheid.Code\"] == \"WATHTE\"\n", "station_wathte_data = df_AquoMetadataLijst.loc[bool_meta_for_station & bool_wathte]\n", "# print the selection\n", "station_wathte_data\n" ] }, { "cell_type": "markdown", "id": "866aab6a-b830-40e2-8937-1b3aad712cc7", "metadata": {}, "source": [ "## POST-requests: retrieving measurements\n", "Finally, we can retrieve the measurements for a desired period with the `/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen` endpoint. Depending on the input provided via \"AquoMetadata\", \"Locatie\" and \"Periode\" there is a certain amount of data returned. There is a maximum of 160000 waarnemingen returned per request." ] }, { "cell_type": "code", "execution_count": 8, "id": "4aeabe14-af8c-41ff-b36c-8eaafeeebe2f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available keys in the response:\n", "dict_keys(['AquoMetadata', 'Locatie', 'MetingenLijst'])\n", "\n", "MetingenLijst raw (first few entries):\n", "[{'Meetwaarde': {'Waarde_Alfanumeriek': '63', 'Waarde_Numeriek': 63.0}, 'Tijdstip': '2023-01-01T01:00:00.000+01:00', 'WaarnemingMetadata': {'Statuswaarde': 'Gecontroleerd', 'Bemonsteringshoogte': '-999999999', 'Referentievlak': 'NVT', 'OpdrachtgevendeInstantie': 'RIKZMON_WAT', 'Kwaliteitswaardecode': '00'}}, {'Meetwaarde': {'Waarde_Alfanumeriek': '56', 'Waarde_Numeriek': 56.0}, 'Tijdstip': '2023-01-01T01:10:00.000+01:00', 'WaarnemingMetadata': {'Statuswaarde': 'Gecontroleerd', 'Bemonsteringshoogte': '-999999999', 'Referentievlak': 'NVT', 'OpdrachtgevendeInstantie': 'RIKZMON_WAT', 'Kwaliteitswaardecode': '00'}}] [...]\n", "\n", "MetingenLijst:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TijdstipMeetwaarde.Waarde_AlfanumeriekMeetwaarde.Waarde_NumeriekWaarnemingMetadata.StatuswaardeWaarnemingMetadata.BemonsteringshoogteWaarnemingMetadata.ReferentievlakWaarnemingMetadata.OpdrachtgevendeInstantieWaarnemingMetadata.Kwaliteitswaardecode
02023-01-01T01:00:00.000+01:006363.0Gecontroleerd-999999999NVTRIKZMON_WAT00
12023-01-01T01:10:00.000+01:005656.0Gecontroleerd-999999999NVTRIKZMON_WAT00
22023-01-01T01:20:00.000+01:005151.0Gecontroleerd-999999999NVTRIKZMON_WAT00
32023-01-01T01:30:00.000+01:004646.0Gecontroleerd-999999999NVTRIKZMON_WAT00
42023-01-01T01:40:00.000+01:004040.0Gecontroleerd-999999999NVTRIKZMON_WAT00
...........................
20122023-01-15T00:20:00.000+01:001515.0Gecontroleerd-999999999NVTRIKZMON_WAT00
20132023-01-15T00:30:00.000+01:001313.0Gecontroleerd-999999999NVTRIKZMON_WAT00
20142023-01-15T00:40:00.000+01:001010.0Gecontroleerd-999999999NVTRIKZMON_WAT00
20152023-01-15T00:50:00.000+01:0088.0Gecontroleerd-999999999NVTRIKZMON_WAT00
20162023-01-15T01:00:00.000+01:0066.0Gecontroleerd-999999999NVTRIKZMON_WAT00
\n", "

2017 rows × 8 columns

\n", "
" ], "text/plain": [ " Tijdstip Meetwaarde.Waarde_Alfanumeriek \\\n", "0 2023-01-01T01:00:00.000+01:00 63 \n", "1 2023-01-01T01:10:00.000+01:00 56 \n", "2 2023-01-01T01:20:00.000+01:00 51 \n", "3 2023-01-01T01:30:00.000+01:00 46 \n", "4 2023-01-01T01:40:00.000+01:00 40 \n", "... ... ... \n", "2012 2023-01-15T00:20:00.000+01:00 15 \n", "2013 2023-01-15T00:30:00.000+01:00 13 \n", "2014 2023-01-15T00:40:00.000+01:00 10 \n", "2015 2023-01-15T00:50:00.000+01:00 8 \n", "2016 2023-01-15T01:00:00.000+01:00 6 \n", "\n", " Meetwaarde.Waarde_Numeriek WaarnemingMetadata.Statuswaarde \\\n", "0 63.0 Gecontroleerd \n", "1 56.0 Gecontroleerd \n", "2 51.0 Gecontroleerd \n", "3 46.0 Gecontroleerd \n", "4 40.0 Gecontroleerd \n", "... ... ... \n", "2012 15.0 Gecontroleerd \n", "2013 13.0 Gecontroleerd \n", "2014 10.0 Gecontroleerd \n", "2015 8.0 Gecontroleerd \n", "2016 6.0 Gecontroleerd \n", "\n", " WaarnemingMetadata.Bemonsteringshoogte WaarnemingMetadata.Referentievlak \\\n", "0 -999999999 NVT \n", "1 -999999999 NVT \n", "2 -999999999 NVT \n", "3 -999999999 NVT \n", "4 -999999999 NVT \n", "... ... ... \n", "2012 -999999999 NVT \n", "2013 -999999999 NVT \n", "2014 -999999999 NVT \n", "2015 -999999999 NVT \n", "2016 -999999999 NVT \n", "\n", " WaarnemingMetadata.OpdrachtgevendeInstantie \\\n", "0 RIKZMON_WAT \n", "1 RIKZMON_WAT \n", "2 RIKZMON_WAT \n", "3 RIKZMON_WAT \n", "4 RIKZMON_WAT \n", "... ... \n", "2012 RIKZMON_WAT \n", "2013 RIKZMON_WAT \n", "2014 RIKZMON_WAT \n", "2015 RIKZMON_WAT \n", "2016 RIKZMON_WAT \n", "\n", " WaarnemingMetadata.Kwaliteitswaardecode \n", "0 00 \n", "1 00 \n", "2 00 \n", "3 00 \n", "4 00 \n", "... ... \n", "2012 00 \n", "2013 00 \n", "2014 00 \n", "2015 00 \n", "2016 00 \n", "\n", "[2017 rows x 8 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# retrieve the measurements\n", "url = \"https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen\"\n", "req = {\n", " \"AquoPlusWaarnemingMetadata\": {\n", " \"AquoMetadata\": {\n", " \"ProcesType\": \"meting\", # meting/astronomisch/verwachting\n", " \"Grootheid\": {\"Code\": \"WATHTE\"}, \n", " \"Hoedanigheid\": {\"Code\": \"NAP\"},\n", " \"Groepering\": {\"Code\": \"\"}, # \"\"/GETETBRKD2/GETETM2\n", " # \"Compartiment\": {\"Code\": \"OW\"},\n", " # \"Eenheid\": {\"Code\": \"cm\"},\n", " # \"Parameter\": {\"Code\": \"NVT\"},\n", " # \"BioTaxon\": {\"Code\": \"NVT\"},\n", " # \"Orgaan\": {\"Code\": \"NVT\"},\n", " # \"Typering\": {\"Code\": \"NVT\"},\n", " # \"WaardeBewerkingsMethode\": {\"Code\": \"NVT\"},\n", " }\n", " },\n", " \"Locatie\": {\"Code\": \"hoekvanholland\"},\n", " \"Periode\": {\"Begindatumtijd\": \"2023-01-01T00:00:00.000+00:00\", \"Einddatumtijd\": \"2023-01-15T00:00:00.000+00:00\"}\n", "}\n", "resp = requests.post(url=url, json=req)\n", "if not resp.ok:\n", " raise Exception(f\"{resp.status_code} {resp.reason}: {resp.text}\")\n", "\n", "result_meas = resp.json()\n", "print(\"Available keys in the response:\")\n", "print(result_meas[\"WaarnemingenLijst\"][0].keys())\n", "print()\n", "print(\"MetingenLijst raw (first few entries):\")\n", "print(result_meas[\"WaarnemingenLijst\"][0][\"MetingenLijst\"][:2], \"[...]\")\n", "print()\n", "print(\"MetingenLijst:\")\n", "# print the metingenlijst\n", "pd.json_normalize(result_meas[\"WaarnemingenLijst\"][0][\"MetingenLijst\"])\n" ] }, { "cell_type": "markdown", "id": "a3706afb-90aa-4867-b953-288b8758f197", "metadata": {}, "source": [ "## ddlpy: a wrapper around the RWS Waterwebservices\n", "The POST-requests to Waterwebservices work very well, but require quite some database knowledge for the user. The Python toolbox [ddlpy](https://github.com/Deltares/ddlpy) simplifies the interaction with the WADAR Waterwebservices. When using ddlpy, the subsetting and retrieval of data becomes much less complex:\n", "* all (meta)data automatically converted to `pandas.DataFrame`\n", "* `ddlpy.locations()` is a combination of all available locations and measurements, so this is the only DataFrame required for subsetting\n", "* `ddlpy.measurements()` takes one row of `ddlpy.locations()` DataFrame, `start_date` and `end_date`\n", "* automatic chunking of requests (per year/month/day) makes it possible to retrieve longer timeseries at once\n", "* proper handling of potential errors returned by the server\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "6f52a2af-56cd-4c8b-849e-6f5c3c313bd7", "metadata": {}, "outputs": [], "source": [ "# imports\n", "import ddlpy\n", "import pandas as pd\n", "\n", "# enabling debug logging so we can see what happens in the background\n", "import logging\n", "logging.basicConfig()\n", "logging.getLogger(\"ddlpy\").setLevel(logging.DEBUG)\n" ] }, { "cell_type": "markdown", "id": "7ef0cd8e-6ea8-4b74-9e31-aa459d00314f", "metadata": {}, "source": [ "## ddlpy: retrieving the catalog\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "b40299d7-e4a6-4c0e-9846-41eb33cbf1e0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:ddlpy.ddlpy:Loading Waterwebservices catalog from cache\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Locatie_MessageIDLatLonCoordinatenstelselNaamOmschrijvingParameter_Wat_OmschrijvingProcesTypeCompartiment.CodeCompartiment.Omschrijving...BioTaxon.CodeBioTaxon.OmschrijvingOrgaan.CodeOrgaan.OmschrijvingGroepering.CodeGroepering.OmschrijvingTypering.CodeTypering.OmschrijvingWaardeBewerkingsMethode.CodeWaardeBewerkingsMethode.Omschrijving
Code
4epetroleumhaven1060351.9535244.140491ETRS894e Petroleumhaven4e Petroleumhaven(massa)Concentratie totaal organisch koolstof ...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
poeldonk.dungensebrug940251.6806735.368564ETRS89Poeldonk, Dungense BrugPoeldonk, Dungense Brug(massa)Concentratie ibuprofen in Oppervlaktewa...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hagestein.boven1380651.9895005.135200ETRS89Hagestein, bovenHagestein, bovenDebiet verwachting in Oppervlaktewater in m3/sverwachtingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
4epetroleumhaven1060351.9535244.140491ETRS894e Petroleumhaven4e Petroleumhaven(massa)Concentratie Onopgeloste stoffen in Opp...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
boomkensdiep1864853.3789645.167224ETRS89BoomkensdiepBoomkensdiep(massa)Concentratie perfluorbutaanzuur in Oppe...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
..................................................................
eemmeerdijk.km231622252.2787515.355114ETRS89Eemmeerdijk, kilometer 23Eemmeerdijk, kilometer 23Massafractie 2,5-dichloornitrobenzeen in Bodem...metingBSBodem/Sediment...NVTNVTNVTNVTNVTNVTNVTNVT
dreischor1404951.7146203.999330ETRS89DreischorDreischorMassafractie 2,2',3,4,4',5',6-heptabroomdifeny...metingBSBodem/Sediment...NVTNVTNVTNVTNVTNVTNVTNVT
kuilvanmarken448252.4789415.270994ETRS89Kuil van MarkenKuil van Marken(massa)Concentratie ammonium in Oppervlaktewat...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
eijsden1546750.7795005.698700ETRS89EijsdenEijsden(massa)Concentratie captan in Oppervlaktewater...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
huibertgat.oost337753.5591336.661199ETRS89Huibertgat, oostHuibertgat, oost(massa)Concentratie dimethoxymethaan in Opperv...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
\n", "

99660 rows × 28 columns

\n", "
" ], "text/plain": [ " Locatie_MessageID Lat Lon \\\n", "Code \n", "4epetroleumhaven 10603 51.953524 4.140491 \n", "poeldonk.dungensebrug 9402 51.680673 5.368564 \n", "hagestein.boven 13806 51.989500 5.135200 \n", "4epetroleumhaven 10603 51.953524 4.140491 \n", "boomkensdiep 18648 53.378964 5.167224 \n", "... ... ... ... \n", "eemmeerdijk.km23 16222 52.278751 5.355114 \n", "dreischor 14049 51.714620 3.999330 \n", "kuilvanmarken 4482 52.478941 5.270994 \n", "eijsden 15467 50.779500 5.698700 \n", "huibertgat.oost 3377 53.559133 6.661199 \n", "\n", " Coordinatenstelsel Naam \\\n", "Code \n", "4epetroleumhaven ETRS89 4e Petroleumhaven \n", "poeldonk.dungensebrug ETRS89 Poeldonk, Dungense Brug \n", "hagestein.boven ETRS89 Hagestein, boven \n", "4epetroleumhaven ETRS89 4e Petroleumhaven \n", "boomkensdiep ETRS89 Boomkensdiep \n", "... ... ... \n", "eemmeerdijk.km23 ETRS89 Eemmeerdijk, kilometer 23 \n", "dreischor ETRS89 Dreischor \n", "kuilvanmarken ETRS89 Kuil van Marken \n", "eijsden ETRS89 Eijsden \n", "huibertgat.oost ETRS89 Huibertgat, oost \n", "\n", " Omschrijving \\\n", "Code \n", "4epetroleumhaven 4e Petroleumhaven \n", "poeldonk.dungensebrug Poeldonk, Dungense Brug \n", "hagestein.boven Hagestein, boven \n", "4epetroleumhaven 4e Petroleumhaven \n", "boomkensdiep Boomkensdiep \n", "... ... \n", "eemmeerdijk.km23 Eemmeerdijk, kilometer 23 \n", "dreischor Dreischor \n", "kuilvanmarken Kuil van Marken \n", "eijsden Eijsden \n", "huibertgat.oost Huibertgat, oost \n", "\n", " Parameter_Wat_Omschrijving \\\n", "Code \n", "4epetroleumhaven (massa)Concentratie totaal organisch koolstof ... \n", "poeldonk.dungensebrug (massa)Concentratie ibuprofen in Oppervlaktewa... \n", "hagestein.boven Debiet verwachting in Oppervlaktewater in m3/s \n", "4epetroleumhaven (massa)Concentratie Onopgeloste stoffen in Opp... \n", "boomkensdiep (massa)Concentratie perfluorbutaanzuur in Oppe... \n", "... ... \n", "eemmeerdijk.km23 Massafractie 2,5-dichloornitrobenzeen in Bodem... \n", "dreischor Massafractie 2,2',3,4,4',5',6-heptabroomdifeny... \n", "kuilvanmarken (massa)Concentratie ammonium in Oppervlaktewat... \n", "eijsden (massa)Concentratie captan in Oppervlaktewater... \n", "huibertgat.oost (massa)Concentratie dimethoxymethaan in Opperv... \n", "\n", " ProcesType Compartiment.Code \\\n", "Code \n", "4epetroleumhaven meting OW \n", "poeldonk.dungensebrug meting OW \n", "hagestein.boven verwachting OW \n", "4epetroleumhaven meting OW \n", "boomkensdiep meting OW \n", "... ... ... \n", "eemmeerdijk.km23 meting BS \n", "dreischor meting BS \n", "kuilvanmarken meting OW \n", "eijsden meting OW \n", "huibertgat.oost meting OW \n", "\n", " Compartiment.Omschrijving ... BioTaxon.Code \\\n", "Code ... \n", "4epetroleumhaven Oppervlaktewater ... NVT \n", "poeldonk.dungensebrug Oppervlaktewater ... NVT \n", "hagestein.boven Oppervlaktewater ... NVT \n", "4epetroleumhaven Oppervlaktewater ... NVT \n", "boomkensdiep Oppervlaktewater ... NVT \n", "... ... ... ... \n", "eemmeerdijk.km23 Bodem/Sediment ... NVT \n", "dreischor Bodem/Sediment ... NVT \n", "kuilvanmarken Oppervlaktewater ... NVT \n", "eijsden Oppervlaktewater ... NVT \n", "huibertgat.oost Oppervlaktewater ... NVT \n", "\n", " BioTaxon.Omschrijving Orgaan.Code Orgaan.Omschrijving \\\n", "Code \n", "4epetroleumhaven NVT NVT NVT \n", "poeldonk.dungensebrug NVT NVT NVT \n", "hagestein.boven NVT NVT NVT \n", "4epetroleumhaven NVT NVT NVT \n", "boomkensdiep NVT NVT NVT \n", "... ... ... ... \n", "eemmeerdijk.km23 NVT NVT NVT \n", "dreischor NVT NVT NVT \n", "kuilvanmarken NVT NVT NVT \n", "eijsden NVT NVT NVT \n", "huibertgat.oost NVT NVT NVT \n", "\n", " Groepering.Code Groepering.Omschrijving Typering.Code \\\n", "Code \n", "4epetroleumhaven NVT \n", "poeldonk.dungensebrug NVT \n", "hagestein.boven NVT \n", "4epetroleumhaven NVT \n", "boomkensdiep NVT \n", "... ... ... ... \n", "eemmeerdijk.km23 NVT \n", "dreischor NVT \n", "kuilvanmarken NVT \n", "eijsden NVT \n", "huibertgat.oost NVT \n", "\n", " Typering.Omschrijving WaardeBewerkingsMethode.Code \\\n", "Code \n", "4epetroleumhaven NVT NVT \n", "poeldonk.dungensebrug NVT NVT \n", "hagestein.boven NVT NVT \n", "4epetroleumhaven NVT NVT \n", "boomkensdiep NVT NVT \n", "... ... ... \n", "eemmeerdijk.km23 NVT NVT \n", "dreischor NVT NVT \n", "kuilvanmarken NVT NVT \n", "eijsden NVT NVT \n", "huibertgat.oost NVT NVT \n", "\n", " WaardeBewerkingsMethode.Omschrijving \n", "Code \n", "4epetroleumhaven NVT \n", "poeldonk.dungensebrug NVT \n", "hagestein.boven NVT \n", "4epetroleumhaven NVT \n", "boomkensdiep NVT \n", "... ... \n", "eemmeerdijk.km23 NVT \n", "dreischor NVT \n", "kuilvanmarken NVT \n", "eijsden NVT \n", "huibertgat.oost NVT \n", "\n", "[99660 rows x 28 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the dataframe with locations and their available parameters\n", "# this operation is cached, but also takes 30 seconds the first time\n", "locations = ddlpy.locations()\n", "locations\n" ] }, { "cell_type": "markdown", "id": "9984edc3-ef02-464c-99cd-b46a3e3b71e7", "metadata": {}, "source": [ "## ddlpy: selecting locations/metadata\n", "Since `locations` already is a combination of all locations/metadata, this is the only `DataFrame` that is required for subsetting.\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "2d931066-09fb-43f7-ad35-4d64925fd51f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Locatie_MessageIDLatLonCoordinatenstelselNaamOmschrijvingParameter_Wat_OmschrijvingProcesTypeCompartiment.CodeCompartiment.Omschrijving...BioTaxon.CodeBioTaxon.OmschrijvingOrgaan.CodeOrgaan.OmschrijvingGroepering.CodeGroepering.OmschrijvingTypering.CodeTypering.OmschrijvingWaardeBewerkingsMethode.CodeWaardeBewerkingsMethode.Omschrijving
Code
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1VersiemetingNTNiet van toepassing...NVTNVTNVTNVTSLOTGMDDESlotgemiddeldenNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1(massa)Concentratie lood in Oppervlaktewater o...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1(massa)Concentratie som orthofosfaat en hydrol...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1Windrichting in Lucht t.o.v. ware Noorden in g...metingLTLucht...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1Waterhoogte astronomisch in Oppervlaktewater t...astronomischOWOppervlaktewater...NVTNVTNVTNVTGETETBRKD2Getijextreem berekendNVTNVTNVTNVT
..................................................................
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1(massa)Concentratie lood in Oppervlaktewater i...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1Hoogwater dag in Oppervlaktewater t.o.v. Norma...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1(massa)Concentratie zuurstof in Oppervlaktewat...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1(massa)Concentratie ammonium in Oppervlaktewat...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1Slotgemiddelde laagwater in Oppervlaktewater B...metingOWOppervlaktewater...NVTNVTNVTNVTSLOTGMDDESlotgemiddeldenNVTNVTNVTNVT
\n", "

66 rows × 28 columns

\n", "
" ], "text/plain": [ " Locatie_MessageID Lat Lon Coordinatenstelsel \\\n", "Code \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "... ... ... ... ... \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "\n", " Naam Omschrijving \\\n", "Code \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "... ... ... \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "\n", " Parameter_Wat_Omschrijving \\\n", "Code \n", "hoekvanholland Versie \n", "hoekvanholland (massa)Concentratie lood in Oppervlaktewater o... \n", "hoekvanholland (massa)Concentratie som orthofosfaat en hydrol... \n", "hoekvanholland Windrichting in Lucht t.o.v. ware Noorden in g... \n", "hoekvanholland Waterhoogte astronomisch in Oppervlaktewater t... \n", "... ... \n", "hoekvanholland (massa)Concentratie lood in Oppervlaktewater i... \n", "hoekvanholland Hoogwater dag in Oppervlaktewater t.o.v. Norma... \n", "hoekvanholland (massa)Concentratie zuurstof in Oppervlaktewat... \n", "hoekvanholland (massa)Concentratie ammonium in Oppervlaktewat... \n", "hoekvanholland Slotgemiddelde laagwater in Oppervlaktewater B... \n", "\n", " ProcesType Compartiment.Code Compartiment.Omschrijving ... \\\n", "Code ... \n", "hoekvanholland meting NT Niet van toepassing ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting LT Lucht ... \n", "hoekvanholland astronomisch OW Oppervlaktewater ... \n", "... ... ... ... ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "hoekvanholland meting OW Oppervlaktewater ... \n", "\n", " BioTaxon.Code BioTaxon.Omschrijving Orgaan.Code \\\n", "Code \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "... ... ... ... \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "hoekvanholland NVT NVT NVT \n", "\n", " Orgaan.Omschrijving Groepering.Code Groepering.Omschrijving \\\n", "Code \n", "hoekvanholland NVT SLOTGMDDE Slotgemiddelden \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT GETETBRKD2 Getijextreem berekend \n", "... ... ... ... \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT SLOTGMDDE Slotgemiddelden \n", "\n", " Typering.Code Typering.Omschrijving \\\n", "Code \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "... ... ... \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "hoekvanholland NVT NVT \n", "\n", " WaardeBewerkingsMethode.Code \\\n", "Code \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "... ... \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "\n", " WaardeBewerkingsMethode.Omschrijving \n", "Code \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "... ... \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "hoekvanholland NVT \n", "\n", "[66 rows x 28 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Filter all measurements for a single station\n", "bool_stations = locations.index.isin([\"hoekvanholland\"])\n", "selected = locations.loc[bool_stations]\n", "# print the selection\n", "selected" ] }, { "cell_type": "code", "execution_count": 12, "id": "18ec45cd-d0b7-4daf-a466-7cf8703aaa97", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Locatie_MessageIDLatLonCoordinatenstelselNaamOmschrijvingParameter_Wat_OmschrijvingProcesTypeCompartiment.CodeCompartiment.Omschrijving...BioTaxon.CodeBioTaxon.OmschrijvingOrgaan.CodeOrgaan.OmschrijvingGroepering.CodeGroepering.OmschrijvingTypering.CodeTypering.OmschrijvingWaardeBewerkingsMethode.CodeWaardeBewerkingsMethode.Omschrijving
Code
hoekvanholland131951.9768994.119827ETRS89Hoek van Hollandrechter oever kilometer 1030.1Waterhoogte in Oppervlaktewater t.o.v. Normaal...metingOWOppervlaktewater...NVTNVTNVTNVTNVTNVTNVTNVT
\n", "

1 rows × 28 columns

\n", "
" ], "text/plain": [ " Locatie_MessageID Lat Lon Coordinatenstelsel \\\n", "Code \n", "hoekvanholland 1319 51.976899 4.119827 ETRS89 \n", "\n", " Naam Omschrijving \\\n", "Code \n", "hoekvanholland Hoek van Holland rechter oever kilometer 1030.1 \n", "\n", " Parameter_Wat_Omschrijving ProcesType \\\n", "Code \n", "hoekvanholland Waterhoogte in Oppervlaktewater t.o.v. Normaal... meting \n", "\n", " Compartiment.Code Compartiment.Omschrijving ... BioTaxon.Code \\\n", "Code ... \n", "hoekvanholland OW Oppervlaktewater ... NVT \n", "\n", " BioTaxon.Omschrijving Orgaan.Code Orgaan.Omschrijving \\\n", "Code \n", "hoekvanholland NVT NVT NVT \n", "\n", " Groepering.Code Groepering.Omschrijving Typering.Code \\\n", "Code \n", "hoekvanholland NVT \n", "\n", " Typering.Omschrijving WaardeBewerkingsMethode.Code \\\n", "Code \n", "hoekvanholland NVT NVT \n", "\n", " WaardeBewerkingsMethode.Omschrijving \n", "Code \n", "hoekvanholland NVT \n", "\n", "[1 rows x 28 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Filter the locations dataframe with the desired parameters and stations.\n", "bool_stations = locations.index.isin([\"hoekvanholland\"])\n", "bool_procestype = locations[\"ProcesType\"].isin([\"meting\"]) # meting/astronomisch/verwachting\n", "bool_grootheid = locations[\"Grootheid.Code\"].isin([\"WATHTE\"]) # waterhoogte\n", "bool_hoedanigheid = locations[\"Hoedanigheid.Code\"].isin([\"NAP\"]) #vertical reference (NAP/MSL)\n", "bool_groepering = locations[\"Groepering.Code\"].isin([\"\"]) # timeseries versus extremes: \"\"/GETETBRKD2/GETETM2\n", "\n", "selected = locations.loc[\n", " bool_stations\n", " & bool_procestype\n", " & bool_grootheid\n", " & bool_hoedanigheid\n", " & bool_groepering\n", " ]\n", "# print the selection\n", "selected\n" ] }, { "cell_type": "markdown", "id": "145a5f2d-b57c-4ac4-9011-c8fda8e5e778", "metadata": {}, "source": [ "## ddlpy: retrieving measurements\n", "A single line of the `locations` (or `selected`) row can be passed to `ddlpy.measurements()`, together with a `start_date`/`end_date`, to retrieve the selected measurements." ] }, { "cell_type": "code", "execution_count": 13, "id": "d46e6e6f-6038-4230-8712-0f8f99992e81", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/1 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WaarnemingMetadata.StatuswaardeWaarnemingMetadata.BemonsteringshoogteWaarnemingMetadata.ReferentievlakWaarnemingMetadata.OpdrachtgevendeInstantieWaarnemingMetadata.KwaliteitswaardecodeCompartiment.CodeCompartiment.OmschrijvingGrootheid.CodeGrootheid.OmschrijvingEenheid.Code...WaardeBewerkingsMethode.OmschrijvingParameter_Wat_OmschrijvingProcesTypeMeetwaarde.Waarde_AlfanumeriekMeetwaarde.Waarde_NumeriekCodeCoordinatenstelselNaamLonLat
time
2023-01-01 01:00:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting6363.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-01 01:10:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting5656.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-01 01:20:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting5151.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-01 01:30:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting4646.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-01 01:40:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting4040.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
..................................................................
2023-01-15 00:20:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting1515.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-15 00:30:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting1313.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-15 00:40:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting1010.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-15 00:50:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting88.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
2023-01-15 01:00:00+01:00Gecontroleerd-999999999NVTRIKZMON_WAT00OWOppervlaktewaterWATHTEWaterhoogtecm...NVTWaterhoogte in Oppervlaktewater t.o.v. Normaal...meting66.0hoekvanhollandETRS89Hoek van Holland4.11982751.976899
\n", "

2017 rows × 48 columns

\n", "" ], "text/plain": [ " WaarnemingMetadata.Statuswaarde \\\n", "time \n", "2023-01-01 01:00:00+01:00 Gecontroleerd \n", "2023-01-01 01:10:00+01:00 Gecontroleerd \n", "2023-01-01 01:20:00+01:00 Gecontroleerd \n", "2023-01-01 01:30:00+01:00 Gecontroleerd \n", "2023-01-01 01:40:00+01:00 Gecontroleerd \n", "... ... \n", "2023-01-15 00:20:00+01:00 Gecontroleerd \n", "2023-01-15 00:30:00+01:00 Gecontroleerd \n", "2023-01-15 00:40:00+01:00 Gecontroleerd \n", "2023-01-15 00:50:00+01:00 Gecontroleerd \n", "2023-01-15 01:00:00+01:00 Gecontroleerd \n", "\n", " WaarnemingMetadata.Bemonsteringshoogte \\\n", "time \n", "2023-01-01 01:00:00+01:00 -999999999 \n", "2023-01-01 01:10:00+01:00 -999999999 \n", "2023-01-01 01:20:00+01:00 -999999999 \n", "2023-01-01 01:30:00+01:00 -999999999 \n", "2023-01-01 01:40:00+01:00 -999999999 \n", "... ... \n", "2023-01-15 00:20:00+01:00 -999999999 \n", "2023-01-15 00:30:00+01:00 -999999999 \n", "2023-01-15 00:40:00+01:00 -999999999 \n", "2023-01-15 00:50:00+01:00 -999999999 \n", "2023-01-15 01:00:00+01:00 -999999999 \n", "\n", " WaarnemingMetadata.Referentievlak \\\n", "time \n", "2023-01-01 01:00:00+01:00 NVT \n", "2023-01-01 01:10:00+01:00 NVT \n", "2023-01-01 01:20:00+01:00 NVT \n", "2023-01-01 01:30:00+01:00 NVT \n", "2023-01-01 01:40:00+01:00 NVT \n", "... ... \n", "2023-01-15 00:20:00+01:00 NVT \n", "2023-01-15 00:30:00+01:00 NVT \n", "2023-01-15 00:40:00+01:00 NVT \n", "2023-01-15 00:50:00+01:00 NVT \n", "2023-01-15 01:00:00+01:00 NVT \n", "\n", " WaarnemingMetadata.OpdrachtgevendeInstantie \\\n", "time \n", "2023-01-01 01:00:00+01:00 RIKZMON_WAT \n", "2023-01-01 01:10:00+01:00 RIKZMON_WAT \n", "2023-01-01 01:20:00+01:00 RIKZMON_WAT \n", "2023-01-01 01:30:00+01:00 RIKZMON_WAT \n", "2023-01-01 01:40:00+01:00 RIKZMON_WAT \n", "... ... \n", "2023-01-15 00:20:00+01:00 RIKZMON_WAT \n", "2023-01-15 00:30:00+01:00 RIKZMON_WAT \n", "2023-01-15 00:40:00+01:00 RIKZMON_WAT \n", "2023-01-15 00:50:00+01:00 RIKZMON_WAT \n", "2023-01-15 01:00:00+01:00 RIKZMON_WAT \n", "\n", " WaarnemingMetadata.Kwaliteitswaardecode \\\n", "time \n", "2023-01-01 01:00:00+01:00 00 \n", "2023-01-01 01:10:00+01:00 00 \n", "2023-01-01 01:20:00+01:00 00 \n", "2023-01-01 01:30:00+01:00 00 \n", "2023-01-01 01:40:00+01:00 00 \n", "... ... \n", "2023-01-15 00:20:00+01:00 00 \n", "2023-01-15 00:30:00+01:00 00 \n", "2023-01-15 00:40:00+01:00 00 \n", "2023-01-15 00:50:00+01:00 00 \n", "2023-01-15 01:00:00+01:00 00 \n", "\n", " Compartiment.Code Compartiment.Omschrijving \\\n", "time \n", "2023-01-01 01:00:00+01:00 OW Oppervlaktewater \n", "2023-01-01 01:10:00+01:00 OW Oppervlaktewater \n", "2023-01-01 01:20:00+01:00 OW Oppervlaktewater \n", "2023-01-01 01:30:00+01:00 OW Oppervlaktewater \n", "2023-01-01 01:40:00+01:00 OW Oppervlaktewater \n", "... ... ... \n", "2023-01-15 00:20:00+01:00 OW Oppervlaktewater \n", "2023-01-15 00:30:00+01:00 OW Oppervlaktewater \n", "2023-01-15 00:40:00+01:00 OW Oppervlaktewater \n", "2023-01-15 00:50:00+01:00 OW Oppervlaktewater \n", "2023-01-15 01:00:00+01:00 OW Oppervlaktewater \n", "\n", " Grootheid.Code Grootheid.Omschrijving Eenheid.Code \\\n", "time \n", "2023-01-01 01:00:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-01 01:10:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-01 01:20:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-01 01:30:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-01 01:40:00+01:00 WATHTE Waterhoogte cm \n", "... ... ... ... \n", "2023-01-15 00:20:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-15 00:30:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-15 00:40:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-15 00:50:00+01:00 WATHTE Waterhoogte cm \n", "2023-01-15 01:00:00+01:00 WATHTE Waterhoogte cm \n", "\n", " ... WaardeBewerkingsMethode.Omschrijving \\\n", "time ... \n", "2023-01-01 01:00:00+01:00 ... NVT \n", "2023-01-01 01:10:00+01:00 ... NVT \n", "2023-01-01 01:20:00+01:00 ... NVT \n", "2023-01-01 01:30:00+01:00 ... NVT \n", "2023-01-01 01:40:00+01:00 ... NVT \n", "... ... ... \n", "2023-01-15 00:20:00+01:00 ... NVT \n", "2023-01-15 00:30:00+01:00 ... NVT \n", "2023-01-15 00:40:00+01:00 ... NVT \n", "2023-01-15 00:50:00+01:00 ... NVT \n", "2023-01-15 01:00:00+01:00 ... NVT \n", "\n", " Parameter_Wat_Omschrijving \\\n", "time \n", "2023-01-01 01:00:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-01 01:10:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-01 01:20:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-01 01:30:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-01 01:40:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "... ... \n", "2023-01-15 00:20:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-15 00:30:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-15 00:40:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-15 00:50:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "2023-01-15 01:00:00+01:00 Waterhoogte in Oppervlaktewater t.o.v. Normaal... \n", "\n", " ProcesType Meetwaarde.Waarde_Alfanumeriek \\\n", "time \n", "2023-01-01 01:00:00+01:00 meting 63 \n", "2023-01-01 01:10:00+01:00 meting 56 \n", "2023-01-01 01:20:00+01:00 meting 51 \n", "2023-01-01 01:30:00+01:00 meting 46 \n", "2023-01-01 01:40:00+01:00 meting 40 \n", "... ... ... \n", "2023-01-15 00:20:00+01:00 meting 15 \n", "2023-01-15 00:30:00+01:00 meting 13 \n", "2023-01-15 00:40:00+01:00 meting 10 \n", "2023-01-15 00:50:00+01:00 meting 8 \n", "2023-01-15 01:00:00+01:00 meting 6 \n", "\n", " Meetwaarde.Waarde_Numeriek Code \\\n", "time \n", "2023-01-01 01:00:00+01:00 63.0 hoekvanholland \n", "2023-01-01 01:10:00+01:00 56.0 hoekvanholland \n", "2023-01-01 01:20:00+01:00 51.0 hoekvanholland \n", "2023-01-01 01:30:00+01:00 46.0 hoekvanholland \n", "2023-01-01 01:40:00+01:00 40.0 hoekvanholland \n", "... ... ... \n", "2023-01-15 00:20:00+01:00 15.0 hoekvanholland \n", "2023-01-15 00:30:00+01:00 13.0 hoekvanholland \n", "2023-01-15 00:40:00+01:00 10.0 hoekvanholland \n", "2023-01-15 00:50:00+01:00 8.0 hoekvanholland \n", "2023-01-15 01:00:00+01:00 6.0 hoekvanholland \n", "\n", " Coordinatenstelsel Naam Lon \\\n", "time \n", "2023-01-01 01:00:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-01 01:10:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-01 01:20:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-01 01:30:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-01 01:40:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "... ... ... ... \n", "2023-01-15 00:20:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-15 00:30:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-15 00:40:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-15 00:50:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "2023-01-15 01:00:00+01:00 ETRS89 Hoek van Holland 4.119827 \n", "\n", " Lat \n", "time \n", "2023-01-01 01:00:00+01:00 51.976899 \n", "2023-01-01 01:10:00+01:00 51.976899 \n", "2023-01-01 01:20:00+01:00 51.976899 \n", "2023-01-01 01:30:00+01:00 51.976899 \n", "2023-01-01 01:40:00+01:00 51.976899 \n", "... ... \n", "2023-01-15 00:20:00+01:00 51.976899 \n", "2023-01-15 00:30:00+01:00 51.976899 \n", "2023-01-15 00:40:00+01:00 51.976899 \n", "2023-01-15 00:50:00+01:00 51.976899 \n", "2023-01-15 01:00:00+01:00 51.976899 \n", "\n", "[2017 rows x 48 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# provide a single row of the locations dataframe to ddlpy.measurements\n", "start_date = \"2023-01-01\"\n", "end_date = \"2023-01-15\"\n", "measurements = ddlpy.measurements(selected.iloc[0], start_date=start_date, end_date=end_date)\n", "# print the retrieved measurements\n", "measurements" ] }, { "cell_type": "code", "execution_count": 14, "id": "9bf4213b-a71b-4109-95b6-661dde42dbfa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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VLfffruqB9TTWOptPPU0lnobj4xlaoynnsZSb+Opp7HU23heWGdj+fOf/6x22mmn8j7esIFMc3Mi80EQ09vbW9OxtLS01HwM9TiWehtPPY2l3sYjY5ka46mnsdTbeOppLPU2npY6G4shH8w+HgoR+xaIM888U9UL6mks9TaeehpLvY1HxjI1xlNPY6m38dTTWOptPGdO07E0jcWqbOpALISobuPGjXUTaQoEAoFAIJic/XvKMzIdHR3qvPPO078KBAKBQCBorP17yjMyAoFAIBAIGhdTnpERCAQCgUDQuJBAJgAXX3yx2mWXXVRnZ6c67LDD1G233ab/ft26deoDH/iA2nvvvdWMGTN0Wdm//Mu/6PzfZI8FeO9736t23313PZb58+erk08+WT300ENVG4tvPAYgAU888UTV1NSkfvOb39RkLEcddZT+/9Nf73vf+6o2Ft94gJtvvlm94hWvUN3d3Tpf/LKXvUxt3bp1UseybNmyCffFfP3iF7+Y1LEAK1asUG9961vVokWL9H05+OCD1S9/+cuqjIMynscff1ydcsop+n3CM3r961+vVq5cWZVx/OUvf1EnnXSS2n777XPfFbxHn/70p9XixYv1O37ssceqRx99tCZj+dWvfqWOO+44NW/ePP39u+66qyrjoIxnaGhIffSjH1UHHHCAnjP4mbe97W3q2WefnfSxAOeff77aZ5999FjmzJmjn9Ott95albFQxpMG1jz8zNe//nVVi7G84x3vmLDOnHDCCez/RwIZJn72s5+ps88+W+f1/va3v6mDDjpIHX/88WrVqlX6RcHXhRdeqO677z516aWXqiuvvFKdfvrpkz4W4JBDDlGXXHKJevDBB9Uf//hHvfBhsRkZGanJeAzw0mDCVhOUsZxxxhnqueeeK3996Utfqtl4EMTgBcbzwcYJr4ezzjoruiyROxYYS6bvCb4+85nPqJkzZ+rgczLHAmADevjhh9Vvf/tbde+996pTTz1VBw9///vfCx+Lbzz9/f36+WDuXnPNNerGG29Ug4ODeqEeHR0tfCz4//D/I7DKA+brN7/5TfXd735Xb4zYKDHWbdu2TfpY8P0jjjhCffGLXyz8/+aOZ8uWLfrZfepTn9K/IsjCHHrVq1416WMB9tprL/Wtb31Lz9+//vWvOkjGPFq9enVNxmPw61//Wt1yyy06yKgWKGPB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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# A dataframe can be easily plotted\n", "measurements.plot(y=\"Meetwaarde.Waarde_Numeriek\", linewidth=0.8)\n" ] }, { "cell_type": "markdown", "id": "b0a82ddf-ef69-48d9-95f0-28362273c248", "metadata": {}, "source": [ "## ddlpy: other useful features\n", "In ddlpy there are several other useful features available:\n", "* access to the other Waterwebservices endpoints via `ddlpy.measurements_latest()`, `ddlpy.measurements_available()` and `ddlpy.measurements_amount()`\n", "* simplifying the returned measurement dataframe by dropping constant columns\n", "* size-efficient conversion to xarray.Dataset\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "2dca2b15-524b-4204-ade7-9fad474acea7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WaarnemingMetadata.KwaliteitswaardecodeWaardeBepalingsMethode.CodeMeetwaarde.Waarde_Numeriek
time
2023-01-01 01:00:00+01:0000other:F00763.0
2023-01-01 01:10:00+01:0000other:F00756.0
2023-01-01 01:20:00+01:0000other:F00751.0
2023-01-01 01:30:00+01:0000other:F00746.0
2023-01-01 01:40:00+01:0000other:F00740.0
............
2023-01-15 00:20:00+01:0000other:F00715.0
2023-01-15 00:30:00+01:0000other:F00713.0
2023-01-15 00:40:00+01:0000other:F00710.0
2023-01-15 00:50:00+01:0000other:F0078.0
2023-01-15 01:00:00+01:0000other:F0076.0
\n", "

2017 rows × 3 columns

\n", "
" ], "text/plain": [ " WaarnemingMetadata.Kwaliteitswaardecode \\\n", "time \n", "2023-01-01 01:00:00+01:00 00 \n", "2023-01-01 01:10:00+01:00 00 \n", "2023-01-01 01:20:00+01:00 00 \n", "2023-01-01 01:30:00+01:00 00 \n", "2023-01-01 01:40:00+01:00 00 \n", "... ... \n", "2023-01-15 00:20:00+01:00 00 \n", "2023-01-15 00:30:00+01:00 00 \n", "2023-01-15 00:40:00+01:00 00 \n", "2023-01-15 00:50:00+01:00 00 \n", "2023-01-15 01:00:00+01:00 00 \n", "\n", " WaardeBepalingsMethode.Code \\\n", "time \n", "2023-01-01 01:00:00+01:00 other:F007 \n", "2023-01-01 01:10:00+01:00 other:F007 \n", "2023-01-01 01:20:00+01:00 other:F007 \n", "2023-01-01 01:30:00+01:00 other:F007 \n", "2023-01-01 01:40:00+01:00 other:F007 \n", "... ... \n", "2023-01-15 00:20:00+01:00 other:F007 \n", "2023-01-15 00:30:00+01:00 other:F007 \n", "2023-01-15 00:40:00+01:00 other:F007 \n", "2023-01-15 00:50:00+01:00 other:F007 \n", "2023-01-15 01:00:00+01:00 other:F007 \n", "\n", " Meetwaarde.Waarde_Numeriek \n", "time \n", "2023-01-01 01:00:00+01:00 63.0 \n", "2023-01-01 01:10:00+01:00 56.0 \n", "2023-01-01 01:20:00+01:00 51.0 \n", "2023-01-01 01:30:00+01:00 46.0 \n", "2023-01-01 01:40:00+01:00 40.0 \n", "... ... \n", "2023-01-15 00:20:00+01:00 15.0 \n", "2023-01-15 00:30:00+01:00 13.0 \n", "2023-01-15 00:40:00+01:00 10.0 \n", "2023-01-15 00:50:00+01:00 8.0 \n", "2023-01-15 01:00:00+01:00 6.0 \n", "\n", "[2017 rows x 3 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# `ddlpy.simplify_dataframe()` drops constant columns\n", "# these constant columns are added as attributes to the simplified DataFrame (meas_simple.attrs)\n", "# if needed, some columns can be preserved via `always_preserved`\n", "meas_simple = ddlpy.simplify_dataframe(measurements, always_preserve=[\"WaardeBepalingsMethode.Code\"])\n", "meas_simple" ] }, { "cell_type": "code", "execution_count": 16, "id": "64412389-b6ef-40d2-94cb-e81f0c9b4fb0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 65kB\n",
       "Dimensions:                                  (time: 2017)\n",
       "Coordinates:\n",
       "  * time                                     (time) datetime64[ns] 16kB 2023-...\n",
       "Data variables:\n",
       "    WaarnemingMetadata.Kwaliteitswaardecode  (time) object 16kB '00' ... '00'\n",
       "    WaardeBepalingsMethode.Code              (time) object 16kB 'other:F007' ...\n",
       "    Meetwaarde.Waarde_Numeriek               (time) float64 16kB 63.0 ... 6.0\n",
       "Attributes: (12/45)\n",
       "    WaarnemingMetadata.Statuswaarde:              Gecontroleerd\n",
       "    WaarnemingMetadata.Bemonsteringshoogte:       -999999999\n",
       "    WaarnemingMetadata.Referentievlak:            NVT\n",
       "    WaarnemingMetadata.OpdrachtgevendeInstantie:  RIKZMON_WAT\n",
       "    Compartiment.Code:                            OW\n",
       "    Compartiment.Omschrijving:                    Oppervlaktewater\n",
       "    ...                                           ...\n",
       "    Meetwaarde.Waarde_Alfanumeriek:               63\n",
       "    Code:                                         hoekvanholland\n",
       "    Coordinatenstelsel:                           ETRS89\n",
       "    Naam:                                         Hoek van Holland\n",
       "    Lon:                                          4.119827\n",
       "    Lat:                                          51.976899
" ], "text/plain": [ " Size: 65kB\n", "Dimensions: (time: 2017)\n", "Coordinates:\n", " * time (time) datetime64[ns] 16kB 2023-...\n", "Data variables:\n", " WaarnemingMetadata.Kwaliteitswaardecode (time) object 16kB '00' ... '00'\n", " WaardeBepalingsMethode.Code (time) object 16kB 'other:F007' ...\n", " Meetwaarde.Waarde_Numeriek (time) float64 16kB 63.0 ... 6.0\n", "Attributes: (12/45)\n", " WaarnemingMetadata.Statuswaarde: Gecontroleerd\n", " WaarnemingMetadata.Bemonsteringshoogte: -999999999\n", " WaarnemingMetadata.Referentievlak: NVT\n", " WaarnemingMetadata.OpdrachtgevendeInstantie: RIKZMON_WAT\n", " Compartiment.Code: OW\n", " Compartiment.Omschrijving: Oppervlaktewater\n", " ... ...\n", " Meetwaarde.Waarde_Alfanumeriek: 63\n", " Code: hoekvanholland\n", " Coordinatenstelsel: ETRS89\n", " Naam: Hoek van Holland\n", " Lon: 4.119827\n", " Lat: 51.976899" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# `ddlpy.dataframe_to_xarray()` converts the DataFrame to an xarray object\n", "# the input dataframe is first passed trough `ddlpy.simplify_dataframe()` and the\n", "# constant columns are added as attributes to the xarray Dataset (ds_meas.attrs)\n", "# all \"*.Omschrijving\" columns are converted to attributes of the \"*.Code\" variables\n", "ds_meas = ddlpy.dataframe_to_xarray(measurements, always_preserve=[\"WaardeBepalingsMethode.Code\"])\n", "ds_meas" ] }, { "cell_type": "code", "execution_count": null, "id": "93417cd6-2b9b-47df-80b1-7d0fe12374a9", "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.12.11" } }, "nbformat": 4, "nbformat_minor": 5 }