From d784bdf3750b7cf595aa230c5406efd42f2973c9 Mon Sep 17 00:00:00 2001
From: Felix Kleinert <f.kleinert@fz-juelich.de>
Date: Thu, 19 Aug 2021 09:17:42 +0200
Subject: [PATCH] include solar_time conv.

---
 mlair/data_handler/data_handler_wrf_chem.py | 41 ++++++++++++++-------
 1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/mlair/data_handler/data_handler_wrf_chem.py b/mlair/data_handler/data_handler_wrf_chem.py
index e117effa..4dbaf827 100644
--- a/mlair/data_handler/data_handler_wrf_chem.py
+++ b/mlair/data_handler/data_handler_wrf_chem.py
@@ -9,6 +9,7 @@ import glob
 import matplotlib.pyplot as plt
 from dask.diagnostics import ProgressBar
 from tzwhere import tzwhere
+import datetime as dt
 from toarstats import toarstats
 
 import hashlib
@@ -413,8 +414,8 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
                  window_lead_time=DEFAULT_WINDOW_LEAD_TIME,
                  external_coords_file: str = None,
                  wind_sectors=None, wind_sector_edge_dim_name=None, statistics_per_var: Dict = None,
-                 aggregation_sampling: str = None, time_zone: str = None, station: str = None,
-                 lazy_preprocessing: bool = False, **kwargs):
+                 aggregation_sampling: str = None, time_zone: str = None, target_time_type: str = None,
+                 station: str = None, lazy_preprocessing: bool = False, **kwargs):
         """
 
 
@@ -453,6 +454,7 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
         self.statistics_per_var = statistics_per_var
         self.aggregation_sampling = aggregation_sampling
         self.time_zone = time_zone
+        self.target_time_type = target_time_type
         self.station = station
 
         self.lazy = lazy_preprocessing
@@ -696,10 +698,13 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
         meta = pd.DataFrame({self.physical_x_coord_name: self.get_coordinates()['lon'].tolist(),
                              self.physical_y_coord_name: self.get_coordinates()['lat'].tolist()},
                             index=self.station)
-        local_time_zone = self.get_local_time_zone_from_lat_lon(meta=meta)
+        if self.target_time_type is None:
+            target_time_type_or_zone = self.get_local_time_zone_from_lat_lon(meta=meta)
+        else:
+            target_time_type_or_zone = self.target_time_type
         collector = []
         for var in self.statistics_per_var.keys():
-            collector.append(self.__toarstats_aggregation(data, local_time_zone, meta, target_sampling, var))
+            collector.append(self.__toarstats_aggregation(data, target_time_type_or_zone, meta, target_sampling, var))
         sampling_data = xr.merge(collector).dropna(self.physical_t_coord_name)
         # sampling_data.attrs = data.attrs
         missing_squeezed_coords = data.coords._names - sampling_data.coords._names
@@ -708,7 +713,7 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
 
         return sampling_data
 
-    def __toarstats_aggregation(self, data, local_time_zone, meta, target_sampling, var):
+    def __toarstats_aggregation(self, data, target_time_type_or_zone, meta, target_sampling, var):
         with TimeTracking(name=f"{self.station}: apply toarstats `{self.statistics_per_var[var]}({var})`"):
             spatial_dims = list(remove_items(data[var].dims, self.physical_t_coord_name))
             try:
@@ -718,7 +723,7 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
                 df = data[var].to_dataframe()[[var]].reset_index(level=spatial_dims)
 
             df = df[[var] + spatial_dims]
-            df = self.set_external_time_zone_and_convert_to_local_time_zone(df, local_time_zone)
+            df = self.set_external_time_zone_and_convert_to_targer_time(df, target_time_type_or_zone)
             df = df.groupby(spatial_dims)
             df = df.apply(self._toarstats_wrapper, sampling=target_sampling, statistics=self.statistics_per_var[var],
                           metadata=(meta[self.physical_y_coord_name], meta[self.physical_x_coord_name]))
@@ -730,21 +735,26 @@ class SingleGridColumnWrfChemDataLoader(BaseWrfChemDataLoader):
             # collector.append(df)
             return df
 
-    def set_external_time_zone_and_convert_to_local_time_zone(self, data, local_time_zone):
+    def set_external_time_zone_and_convert_to_targer_time(self, data, target_time_type_or_zone):
         """
 
         :param data:
         :type data:
-        :param local_time_zone:
-        :type local_time_zone:
+        :param target_time_type_or_zone:
+        :type target_time_type_or_zone:
         :return:
         :rtype:
         """
         hdata = data
         # hdata = data.squeeze().to_pandas()
-        hdata.index = self.set_time_zone(hdata.index)
-        hdata.index = hdata.index.tz_convert(local_time_zone)
-        logging.debug(f"Set local time zone to: {local_time_zone}")
+        if target_time_type_or_zone == "solar_time":
+            lon = self.get_coordinates()['lon']
+            toffset = dt.timedelta(hours=np.floor(lon/15.))
+            hdata.index = hdata.index + toffset
+        else:
+            hdata.index = self.set_time_zone(hdata.index)
+            hdata.index = hdata.index.tz_convert(target_time_type_or_zone)
+            logging.debug(f"Set local time zone to: {target_time_type_or_zone}")
         return hdata
 
     def get_local_time_zone_from_lat_lon(self, lat=None, lon=None, meta=None):
@@ -798,6 +808,7 @@ class DataHandlerSingleGridColumn(DataHandlerSingleStation):
                  date_format_of_nc_file=None,
                  as_image_like_data_format=True,
                  time_zone=None,
+                 target_time_type=None,
                  input_output_sampling4toarstats : tuple = None,
                  **kwargs):
         self.external_coords_file = external_coords_file
@@ -814,6 +825,7 @@ class DataHandlerSingleGridColumn(DataHandlerSingleStation):
         self.as_image_like_data_format = as_image_like_data_format
 
         self.time_zone = time_zone
+        self.target_time_type = target_time_type
         self.input_output_sampling4toarstats = input_output_sampling4toarstats
         super().__init__(*args, **kwargs)
 
@@ -899,6 +911,7 @@ class DataHandlerSingleGridColumn(DataHandlerSingleStation):
                                                    statistics_per_var=self.statistics_per_var,
                                                    aggregation_sampling=self.input_output_sampling4toarstats[1],
                                                    time_zone=self.time_zone,
+                                                   target_time_type=self.target_time_type,
                                                    station=self.station,
                                                    lazy_preprocessing=True,
                                                    )
@@ -947,7 +960,7 @@ class DataHandlerSingleGridColumn(DataHandlerSingleStation):
     # @TimeTrackingWrapper
     # def prepare_and_apply_toarstats(self, data, meta, target_sampling="daily"):
     #     local_time_zone = self.get_local_time_zone_from_lat_lon(meta=meta)
-    #     hdata = self.set_external_time_zone_and_convert_to_local_time_zone(data, local_time_zone)
+    #     hdata = self.set_external_time_zone_and_convert_to_targer_time(data, local_time_zone)
     #     hsampling_data = []
     #     for i, var in enumerate(hdata.columns):
     #         hdf = toarstats(target_sampling, self.statistics_per_var[var], hdata[var],
@@ -964,7 +977,7 @@ class DataHandlerSingleGridColumn(DataHandlerSingleStation):
     #
     #     return self._force_dask_computation(sampling_data)
     #
-    # def set_external_time_zone_and_convert_to_local_time_zone(self, data, local_time_zone):
+    # def set_external_time_zone_and_convert_to_targer_time(self, data, local_time_zone):
     #     """
     #
     #     :param data:
-- 
GitLab