def test_export2tiff_mask_tuple_string(self): eop = EOPatch.load(self.PATCH_FILENAME) dates = np.array(eop.timestamp) mask = np.arange(len(dates) * 3 * 2 * 1).reshape(len(dates), 3, 2, 1) eop.mask['mask'] = mask indices = [2, 4] # day time gets floored times = (datetime_to_iso(dates[indices[0]]), datetime_to_iso(dates[indices[1]])) selection = np.nonzero( np.where((dates >= iso_to_datetime(times[0])) & (dates <= iso_to_datetime(times[1])), dates, 0)) subset = mask[selection].squeeze() with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file_name = 'temp_file.tiff' task = ExportToTiff((FeatureType.MASK, 'mask'), folder=tmp_dir_name, date_indices=times) task.execute(eop, filename=tmp_file_name) # rasterio saves `bands` to the last dimension, move it up front raster = read_data(os.path.join(tmp_dir_name, tmp_file_name)) raster = np.moveaxis(raster, -1, 0) self.assertTrue(np.all(subset == raster))
def _build_payloads(self, bbox, size_x, size_y, timestamp, time_interval): """ Build payloads for the requests to the service """ if self.single_scene: dates = [(iso_to_datetime(time_interval[0]), iso_to_datetime(time_interval[1]))] else: dates = [(date - self.time_difference, date + self.time_difference) for date in timestamp] return [self._request_payload(date1, date2, bbox, size_x, size_y) for date1, date2 in dates]
def _build_requests(self, bbox, size_x, size_y, timestamp, time_interval): """ Build requests """ if self.single_scene: dates = [(iso_to_datetime(time_interval[0]), iso_to_datetime(time_interval[1]))] else: dates = [(date - self.time_difference, date + self.time_difference) for date in timestamp] return [ self._create_sh_request(date1, date2, bbox, size_x, size_y) for date1, date2 in dates ]
def _add_meta_info(self, eopatch, request_params, service_type): """ Adds any missing metadata info to EOPatch """ for param, eoparam in zip( ['time', 'time_difference', 'maxcc'], ['time_interval', 'time_difference', 'maxcc']): if eoparam not in eopatch.meta_info: if param == 'time': value = request_params[param] eopatch.meta_info[eoparam] = value if isinstance( value, str) else [ iso_to_datetime(parse_time(x)) if isinstance( x, str) else x for x in value ] else: eopatch.meta_info[eoparam] = request_params[param] if 'service_type' not in eopatch.meta_info: eopatch.meta_info['service_type'] = service_type.value for param in ['size_x', 'size_y']: if param not in eopatch.meta_info: eopatch.meta_info[param] = getattr(self, param) if eopatch.bbox is None: eopatch.bbox = request_params['bbox']
def test_iso_to_datetime(self): test_pairs = [ ('2018-01-01', datetime.datetime(2018, 1, 1)), ('2017-02-28', datetime.datetime(2017, 2, 28)) ] for date_str, date_dt in test_pairs: with self.subTest(msg=date_str): res_dt = time_utils.iso_to_datetime(date_str) self.assertEqual(res_dt, date_dt, msg='Expected {}, got {}'.format(date_dt, res_dt))
def _update_other_data(self, eopatch): if 'time_interval' in eopatch.meta_info: start_time, end_time = [iso_to_datetime(x) if isinstance(x, str) else x for x in eopatch.meta_info['time_interval']] eopatch.meta_info['time_interval'] = (max(start_time, self.start_date), min(end_time, self.end_date)) return eopatch
def _get_dates_subset(self, array, dates): dates = np.array(dates) if isinstance(self.date_indices, list): if [ date for date in self.date_indices if not isinstance(date, int) ]: raise ValueError( 'Invalid format in {} list, expected integers'.format( self.date_indices)) array_sub = array[np.array(self.date_indices)] elif isinstance(self.date_indices, tuple): if tuple(map(type, self.date_indices)) == (int, int): start_date = dates[self.date_indices[0]] end_date = dates[self.date_indices[1]] elif tuple(map(type, self.date_indices)) == (str, str): start_date = iso_to_datetime(self.date_indices[0]) end_date = iso_to_datetime(self.date_indices[1]) elif tuple(map(type, self.date_indices)) == (datetime.datetime, datetime.datetime): start_date = self.date_indices[0] end_date = self.date_indices[1] else: raise ValueError( 'Invalid format in {} tuple, expected ints, strings, or datetimes' .format(self.date_indices)) array_sub = array[np.nonzero( np.where((dates >= start_date) & (dates <= end_date), dates, 0))[0]] else: raise ValueError( 'Invalid format in {}, expected tuple or list'.format( self.date_indices)) return array_sub
def fis_data_to_df(fis_data): """Creates a pd.DataFrame from list of FIS responses""" COLUMNS = ['channel', 'date', 'min', 'max', 'mean', 'stDev'] data = [] for fis_response in fis_data: for channel, channel_stats in fis_response.items(): for stat in channel_stats: row = [int(channel[1:]), iso_to_datetime(stat['date'])] for column in COLUMNS[2:]: row.append(stat['basicStats'][column]) data.append(row) return pd.DataFrame(data, columns=COLUMNS).sort_values(['channel', 'date'])
def test_time_interval(self): for task in self.task_cases: with self.subTest(msg='Test case {}'.format(task.name)): self.assertEqual( task.eop.meta_info['time_interval'], [iso_to_datetime(x) for x in ('2017-1-1', '2018-1-1')])