Skip to content
Snippets Groups Projects
data_processor_v1.ipynb 7.04 KiB
Newer Older
Diego Gomes's avatar
Diego Gomes committed
{
 "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
}