def _set_constraint_limits(self, data, subset_constraint): """ Identify and set the constraint limits by: * parsing anything that needs parsing (datetimes) * ordering them always :param data: :param subset_constraint: :return: """ for coord in data.coords(): # Match user-specified limits with dimensions found in data. guessed_axis = guess_coord_axis(coord) limit = None if coord.name() in self._limits: limit = self._limits[coord.name()] elif guessed_axis is not None: if guessed_axis in self._limits: limit = self._limits[guessed_axis] elif guessed_axis.lower() in self._limits: limit = self._limits[guessed_axis.lower()] if limit is not None: wrapped = False if limit.is_time or guessed_axis == 'T': # Ensure that the limits are date/times. dt = parse_datetime.convert_datetime_components_to_datetime(limit.start, True) limit_start = self._convert_datetime_to_coord_unit(coord, dt) dt = parse_datetime.convert_datetime_components_to_datetime(limit.end, False) limit_end = self._convert_datetime_to_coord_unit(coord, dt) else: # Assume to be a non-time axis. (limit_start, limit_end) = self._fix_non_circular_limits(float(limit.start), float(limit.end)) subset_constraint.set_limit(coord, limit_start, limit_end)
def _make_partially_collapsed_coord(self, coord, grid, guessed_axis): """ Make a new DimCoord which represents a partially collapsed (aggregated into bins) coordinate. This dimcoord will have a grid :type coord: data_io.Coord.Coord :param coord: Coordinate to partially collapse :type grid: aggregation.aggregation_grid.AggregationGrid :param grid: grid on which this coordinate will aggregate :type guessed_axis: str :param guessed_axis: String identifier of the axis to which this coordinate belongs (e.g. 'T', 'X') :return: DimCoord """ if grid.is_time or guessed_axis == 'T': # Ensure that the limits are date/times. dt = parse_datetime.convert_datetime_components_to_datetime(grid.start, True) grid_start = Subset._convert_datetime_to_coord_unit(coord, dt) dt = parse_datetime.convert_datetime_components_to_datetime(grid.end, False) grid_end = Subset._convert_datetime_to_coord_unit(coord, dt) grid_delta = grid.delta else: # Assume to be a non-time axis (grid_start, grid_end) = Subset._fix_non_circular_limits(float(grid.start), float(grid.end)) grid_delta = float(grid.delta) new_coordinate_grid = aggregation_grid_array(grid_start, grid_end, grid_delta, grid.is_time, coord) new_coord = DimCoord(new_coordinate_grid, var_name=coord.name(), standard_name=coord.standard_name, units=coord.units) if len(new_coord.points) == 1: new_coord.bounds = [[grid_start, grid_end]] else: new_coord.guess_bounds() return new_coord
def _set_constraint_limits(self, data, subset_constraint): """ Identify and set the constraint limits on the subset_constraint object using the coordinates from the data object :param data: The data object containing the coordinates to subset :param subset_constraint: The constraint object on to which to apply the limits """ for coord in data.coords(dim_coords=True): # Match user-specified limits with dimensions found in data. guessed_axis = guess_coord_axis(coord) limit = None if coord.name() in self._limits: limit = self._limits.pop(coord.name()) elif hasattr(coord, 'var_name') and coord.var_name in self._limits: limit = self._limits.pop(coord.var_name) elif coord.standard_name in self._limits: limit = self._limits.pop(coord.standard_name) elif coord.long_name in self._limits: limit = self._limits.pop(coord.long_name) elif guessed_axis is not None: if guessed_axis in self._limits: limit = self._limits.pop(guessed_axis) elif guessed_axis.lower() in self._limits: limit = self._limits.pop(guessed_axis.lower()) if limit is not None: wrapped = False if limit.is_time or guessed_axis == 'T': # Ensure that the limits are date/times. dt = parse_datetime.convert_datetime_components_to_datetime(limit.start, True) limit_start = self._convert_datetime_to_coord_unit(coord, dt) dt = parse_datetime.convert_datetime_components_to_datetime(limit.end, False) limit_end = self._convert_datetime_to_coord_unit(coord, dt) else: # Assume to be a non-time axis. (limit_start, limit_end) = self._fix_non_circular_limits(float(limit.start), float(limit.end)) # Apply the limit to the constraint object subset_constraint.set_limit(coord, limit_start, limit_end)
def convert_datetime_components_to_datetime_raises_error_if_invalid_time(): dt = convert_datetime_components_to_datetime([2000, 6, 30, 12, 30, 60], True)
def convert_datetime_components_to_datetime_can_convert_date_hour_min_as_upper_limit(): dt = convert_datetime_components_to_datetime([1990, 6, 7, 6, 30], False) assert (dt == datetime.datetime(1990, 6, 7, 6, 30, 59))
def convert_datetime_components_to_datetime_can_convert_date_hour_min_sec_as_upper_limit(): dt = convert_datetime_components_to_datetime([1990, 6, 7, 12, 15, 45], False) assert (dt == datetime.datetime(1990, 6, 7, 12, 15, 45))
def convert_datetime_components_to_datetime_can_convert_date_hour_min_as_lower_limit(): dt = convert_datetime_components_to_datetime([1990, 6, 7, 6, 30], True) assert (dt == datetime.datetime(1990, 6, 7, 6, 30, 0))
def convert_datetime_components_to_datetime_can_convert_year_month_day_as_upper_limit(): dt = convert_datetime_components_to_datetime([1990, 6, 7], False) assert (dt == datetime.datetime(1990, 6, 7, 23, 59, 59))
def convert_datetime_components_to_datetime_can_convert_year_month_day_as_lower_limit(): dt = convert_datetime_components_to_datetime([1990, 6, 7], True) assert (dt == datetime.datetime(1990, 6, 7, 0, 0, 0))
def convert_datetime_components_to_datetime_can_convert_year_int_as_upper_limit(): dt = convert_datetime_components_to_datetime(2000, False) assert (dt == datetime.datetime(2000, 12, 31, 23, 59, 59))
def convert_datetime_components_to_datetime_can_convert_year_int_as_lower_limit(): dt = convert_datetime_components_to_datetime(2000, True) assert (dt == datetime.datetime(2000, 1, 1, 0, 0, 0))