Пример #1
0
    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)
Пример #2
0
 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
Пример #3
0
    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)
Пример #4
0
def convert_datetime_components_to_datetime_raises_error_if_invalid_time():
    dt = convert_datetime_components_to_datetime([2000, 6, 30, 12, 30, 60], True)
Пример #5
0
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))
Пример #6
0
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))
Пример #7
0
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))
Пример #8
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))
Пример #9
0
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))
Пример #10
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))
Пример #11
0
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))