def get_interpolated(self, target_times, parameter): """ Interpolate <parameter> from this dataset to the supplied times :param target_times: Times to interpolate to :param parameter: Parameter defining the data to be interpolated :return: DataArray containing the interpolated data """ log.info('<%s> get_interpolated source: %s parameter: %r', self.request_id, self.stream_key.as_refdes(), parameter) name = parameter.name datasets = [self.datasets[deployment][['obs', 'time', name]] for deployment in sorted(self.datasets) if name in self.datasets[deployment]] if datasets: shape = datasets[0][name].shape if len(shape) != 1: raise StreamEngineException('<%s> Attempted to interpolate >1d data: %s', self.request_id, shape) # Two possible choices here. # 1) Requested times are contained in a single deployment -> pull from deployment # 2) Requested times span multiple deployments. Collapse all deployments to a single dataset start, end = target_times[0], target_times[-1] # Search for a single deployment which covers this request for dataset in datasets: ds_start, ds_end = dataset.time.values[0], dataset.time.values[-1] if ds_start <= start and ds_end >= end: return interp1d_data_array(dataset.time.values, dataset[name], time=target_times) # No single deployment contains this data. Create a temporary dataset containing all # deployments which contain data for the target parameter, then interpolate ds = compile_datasets(datasets) return interp1d_data_array(ds.time.values, ds[name], time=target_times)
def get_interpolated(self, target_times, parameter): """ Interpolate <parameter> from this dataset to the supplied times :param target_times: Times to interpolate to :param parameter: Parameter defining the data to be interpolated :return: DataArray containing the interpolated data """ log.info('<%s> get_interpolated source: %s parameter: %r', self.request_id, self.stream_key.as_refdes(), parameter) name = parameter.name datasets = [ self.datasets[deployment][['obs', 'time', name]] for deployment in sorted(self.datasets) if name in self.datasets[deployment] ] if datasets: shape = datasets[0][name].shape if len(shape) != 1: raise StreamEngineException( '<%s> Attempted to interpolate >1d data: %s', self.request_id, shape) # Two possible choices here. # 1) Requested times are contained in a single deployment -> pull from deployment # 2) Requested times span multiple deployments. Collapse all deployments to a single dataset start, end = target_times[0], target_times[-1] # Search for a single deployment which covers this request for dataset in datasets: ds_start, ds_end = dataset.time.values[0], dataset.time.values[ -1] if ds_start <= start and ds_end >= end: return interp1d_data_array(dataset.time.values, dataset[name], time=target_times) # No single deployment contains this data. Create a temporary dataset containing all # deployments which contain data for the target parameter, then interpolate ds = compile_datasets(datasets) return interp1d_data_array(ds.time.values, ds[name], time=target_times)