{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "dd9cf71b-e692-4c35-864a-428259e8bf7b", "metadata": {}, "outputs": [], "source": [ "from datetime import datetime\n", "from matplotlib.dates import DateFormatter, MonthLocator\n", "import matplotlib.pyplot as plt\n", "\n", "class ProjectDataProcessor:\n", " \"\"\"Process data for latent heat flux comparison between FLUXNET and MODIS dataset\"\"\"\n", " \n", " def __init__(self, FLUXNET_file_path, MODIS_file_path):\n", " \n", " self.FLUXNET_file_path = FLUXNET_file_path\n", " self.MODIS_file_path = MODIS_file_path\n", " \n", " self.data_FLUXNET = {}\n", " self.data_MODIS = {}\n", " \n", " self._load_FLUXNET_data()\n", " self._load_MODIS_data()\n", " \n", " \n", " def _load_FLUXNET_data(self):\n", " \"\"\"Load latent heat flux data from FLUXNET dataset\"\"\"\n", " \n", " date_list = []\n", " value_list = []\n", " \n", " with open(self.FLUXNET_file_path, 'r', encoding='utf-8') as f:\n", " \n", " first_line = f.readline().split(',')\n", " ts_index = first_line.index('TIMESTAMP')\n", " le_index = first_line.index('LE_F_MDS')\n", " \n", " for line in f:\n", " line = line.split(',')\n", " date = datetime.strptime(line[ts_index], '%Y%m%d')\n", " value = line[le_index]\n", " date_list.append(date)\n", " value_list.append(float(value))\n", " \n", " for year in range(min(date_list).year, max(date_list).year + 1):\n", " self.data_FLUXNET[year] = {'dates':[], 'values':[]}\n", " \n", " for date, value in zip(date_list, value_list):\n", " self.data_FLUXNET[date.year]['dates'].append(date)\n", " self.data_FLUXNET[date.year]['values'].append(value)\n", " \n", " \n", " def _load_MODIS_data(self):\n", " \"\"\"Load latent heat flux data from MODIS dataset\"\"\"\n", " \n", " date_list = []\n", " value_list = []\n", " \n", " with open(self.MODIS_file_path, 'r', encoding='utf-8') as f:\n", " \n", " for line in f:\n", " line = line.split(',')\n", " date = datetime.strptime(line[2], 'A%Y%j')\n", " value = line[5:][144]\n", " \n", " if value != 'F':\n", " date_list.append(date)\n", " value_list.append(float(value)/ (24*60*60))\n", " \n", " for year in range(min(date_list).year, max(date_list).year + 1):\n", " self.data_MODIS[year] = {'dates':[], 'values':[]}\n", " \n", " for date, value in zip(date_list, value_list):\n", " self.data_MODIS[date.year]['dates'].append(date)\n", " self.data_MODIS[date.year]['values'].append(value)\n", " \n", " \n", " def plot(self, *years):\n", " \"\"\"Plot latent heat flux data from FLUXNET and MODIS given any number of available years\"\"\"\n", " \n", " for year in years:\n", " if year not in self.data_FLUXNET.keys() or year not in self.data_MODIS.keys():\n", " raise ValueError('Make sure all specified years are available in both datasets')\n", " \n", " fig, axs = plt.subplots(len(years), 1, figsize=(10, 5*len(years)))\n", " \n", " for count, year in enumerate(years):\n", " x_f = self.data_FLUXNET[year]['dates']\n", " y_f = self.data_FLUXNET[year]['values']\n", " \n", " x_m = self.data_MODIS[year]['dates']\n", " y_m = self.data_MODIS[year]['values']\n", " \n", " if len(years) > 1:\n", " axs[count].plot(x_f, y_f, label='FLUXNET ' + str(year))\n", " axs[count].plot(x_m, y_m, label='MODIS ' + str(year))\n", " axs[count].set_xlim([datetime.strptime('1.1.'+str(year), '%d.%m.%Y'),\n", " datetime.strptime('31.12.'+str(year), '%d.%m.%Y')])\n", " axs[count].set_ylabel('Latent Heat Flux [W m-2]')\n", " axs[count].xaxis.set_major_locator(MonthLocator())\n", " axs[count].xaxis.set_major_formatter(DateFormatter('%b'))\n", " axs[count].set_title(year)\n", " axs[count].legend()\n", " \n", " else:\n", " axs.plot(x_f, y_f, label='FLUXNET ' + str(year))\n", " axs.plot(x_m, y_m, label='MODIS ' + str(year))\n", " axs.set_xlim([datetime.strptime('1.1.'+str(year), '%d.%m.%Y'),\n", " datetime.strptime('31.12.'+str(year), '%d.%m.%Y')])\n", " axs.set_ylabel('Latent Heat Flux [W m-2]')\n", " axs.xaxis.set_major_locator(MonthLocator())\n", " axs.xaxis.set_major_formatter(DateFormatter('%b'))\n", " axs.set_title(year)\n", " axs.legend()\n", " \n", " plt.show()\n", " " ] }, { "cell_type": "code", "execution_count": null, "id": "b5ff9ec5-2ccf-408f-98b5-1df96f2d5d26", "metadata": {}, "outputs": [], "source": [ "FLUXNET_file_path = 'data/Oensingen_FLUXNET/FLX_CH-Oe2_FLUXNET2015_FULLSET_DD_2004-2014_1-4.csv'\n", "MODIS_file_path = 'data/Oensingen_MODIS/LE_500m_filtered_scaled.csv'\n", "\n", "oensingen = ProjectDataProcessor(FLUXNET_file_path, MODIS_file_path)\n", " \n", "print(f'FLUXNET years available: {oensingen.data_FLUXNET.keys()}')\n", "print(f'MODIS years available: {oensingen.data_MODIS.keys()}')\n", " " ] }, { "cell_type": "code", "execution_count": null, "id": "2ccfe8b7-b77c-4d27-abf8-af0f7c0db240", "metadata": {}, "outputs": [], "source": [ "# Call the plot functions with the years to be plotted\n", "\n", "oensingen.plot(2010,2011,2012)" ] }, { "cell_type": "code", "execution_count": null, "id": "b61f160b-1cdb-4131-8c8a-11d2c4b27b88", "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.8.7" } }, "nbformat": 4, "nbformat_minor": 5 }