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