docs: def cftime_range(start=None, end=None, periods=None, freq='D',
                   normalize=False, name=None, closed=None,
                   calendar='standard'):
      """Return a fixed frequency CFTimeIndex.
  
      Parameters
      ----------
      start : str or cftime.datetime, optional
          Left bound for generating dates.
      end : str or cftime.datetime, optional
          Right bound for generating dates.
      periods : integer, optional
          Number of periods to generate.
      freq : str, default 'D', BaseCFTimeOffset, or None
         Frequency strings can have multiples, e.g. '5H'.
      normalize : bool, default False
          Normalize start/end dates to midnight before generating date range.
      name : str, default None
          Name of the resulting index
      closed : {None, 'left', 'right'}, optional
          Make the interval closed with respect to the given frequency to the
          'left', 'right', or both sides (None, the default).
      calendar : str
          Calendar type for the datetimes (default 'standard').
  
      Returns
      -------
      CFTimeIndex
  
      Notes
      -----
  
      This function is an analog of ``pandas.date_range`` for use in generating
      sequences of ``cftime.datetime`` objects.  It supports most of the
      features of ``pandas.date_range`` (e.g. specifying how the index is
      ``closed`` on either side, or whether or not to ``normalize`` the start and
      end bounds); however, there are some notable exceptions:
  
      - You cannot specify a ``tz`` (time zone) argument.
      - Start or end dates specified as partial-datetime strings must use the
        `ISO-8601 format <https://en.wikipedia.org/wiki/ISO_8601>`_.
      - It supports many, but not all, frequencies supported by
        ``pandas.date_range``.  For example it does not currently support any of
        the business-related, semi-monthly, or sub-second frequencies.
      - Compound sub-monthly frequencies are not supported, e.g. '1H1min', as
        these can easily be written in terms of the finest common resolution,
        e.g. '61min'.
  
      Valid simple frequency strings for use with ``cftime``-calendars include
      any multiples of the following.
  
      +--------+--------------------------+
      | Alias  | Description              |
      +========+==========================+
      | A, Y   | Year-end frequency       |
      +--------+--------------------------+
      | AS, YS | Year-start frequency     |
      +--------+--------------------------+
      | Q      | Quarter-end frequency    |
      +--------+--------------------------+
      | QS     | Quarter-start frequency  |
      +--------+--------------------------+
      | M      | Month-end frequency      |
      +--------+--------------------------+
      | MS     | Month-start frequency    |
      +--------+--------------------------+
      | D      | Day frequency            |
      +--------+--------------------------+
      | H      | Hour frequency           |
      +--------+--------------------------+
      | T, min | Minute frequency         |
      +--------+--------------------------+
      | S      | Second frequency         |
      +--------+--------------------------+
  
      Any multiples of the following anchored offsets are also supported.
  
      +----------+--------------------------------------------------------------------+
      | Alias    | Description                                                        |
      +==========+====================================================================+
      | A(S)-JAN | Annual frequency, anchored at the end (or beginning) of January    |
      +----------+--------------------------------------------------------------------+
      | A(S)-FEB | Annual frequency, anchored at the end (or beginning) of February   |
      +----------+--------------------------------------------------------------------+
      | A(S)-MAR | Annual frequency, anchored at the end (or beginning) of March      |
      +----------+--------------------------------------------------------------------+
      | A(S)-APR | Annual frequency, anchored at the end (or beginning) of April      |
      +----------+--------------------------------------------------------------------+
      | A(S)-MAY | Annual frequency, anchored at the end (or beginning) of May        |
      +----------+--------------------------------------------------------------------+
      | A(S)-JUN | Annual frequency, anchored at the end (or beginning) of June       |
      +----------+--------------------------------------------------------------------+
      | A(S)-JUL | Annual frequency, anchored at the end (or beginning) of July       |
      +----------+--------------------------------------------------------------------+
      | A(S)-AUG | Annual frequency, anchored at the end (or beginning) of August     |
      +----------+--------------------------------------------------------------------+
      | A(S)-SEP | Annual frequency, anchored at the end (or beginning) of September  |
      +----------+--------------------------------------------------------------------+
      | A(S)-OCT | Annual frequency, anchored at the end (or beginning) of October    |
      +----------+--------------------------------------------------------------------+
      | A(S)-NOV | Annual frequency, anchored at the end (or beginning) of November   |
      +----------+--------------------------------------------------------------------+
      | A(S)-DEC | Annual frequency, anchored at the end (or beginning) of December   |
      +----------+--------------------------------------------------------------------+
      | Q(S)-JAN | Quarter frequency, anchored at the end (or beginning) of January   |
      +----------+--------------------------------------------------------------------+
      | Q(S)-FEB | Quarter frequency, anchored at the end (or beginning) of February  |
      +----------+--------------------------------------------------------------------+
      | Q(S)-MAR | Quarter frequency, anchored at the end (or beginning) of March     |
      +----------+--------------------------------------------------------------------+
      | Q(S)-APR | Quarter frequency, anchored at the end (or beginning) of April     |
      +----------+--------------------------------------------------------------------+
      | Q(S)-MAY | Quarter frequency, anchored at the end (or beginning) of May       |
      +----------+--------------------------------------------------------------------+
      | Q(S)-JUN | Quarter frequency, anchored at the end (or beginning) of June      |
      +----------+--------------------------------------------------------------------+
      | Q(S)-JUL | Quarter frequency, anchored at the end (or beginning) of July      |
      +----------+--------------------------------------------------------------------+
      | Q(S)-AUG | Quarter frequency, anchored at the end (or beginning) of August    |
      +----------+--------------------------------------------------------------------+
      | Q(S)-SEP | Quarter frequency, anchored at the end (or beginning) of September |
      +----------+--------------------------------------------------------------------+
      | Q(S)-OCT | Quarter frequency, anchored at the end (or beginning) of October   |
      +----------+--------------------------------------------------------------------+
      | Q(S)-NOV | Quarter frequency, anchored at the end (or beginning) of November  |
      +----------+--------------------------------------------------------------------+
      | Q(S)-DEC | Quarter frequency, anchored at the end (or beginning) of December  |
      +----------+--------------------------------------------------------------------+
  
  
      Finally, the following calendar aliases are supported.
  
      +--------------------------------+---------------------------------------+
      | Alias                          | Date type                             |
      +================================+=======================================+
      | standard, gregorian            | ``cftime.DatetimeGregorian``          |
      +--------------------------------+---------------------------------------+
      | proleptic_gregorian            | ``cftime.DatetimeProlepticGregorian`` |
      +--------------------------------+---------------------------------------+
      | noleap, 365_day                | ``cftime.DatetimeNoLeap``             |
      +--------------------------------+---------------------------------------+
      | all_leap, 366_day              | ``cftime.DatetimeAllLeap``            |
      +--------------------------------+---------------------------------------+
      | 360_day                        | ``cftime.Datetime360Day``             |
      +--------------------------------+---------------------------------------+
      | julian                         | ``cftime.DatetimeJulian``             |
      +--------------------------------+---------------------------------------+
  
      Examples
      --------
  
      This function returns a ``CFTimeIndex``, populated with ``cftime.datetime``
      objects associated with the specified calendar type, e.g.
  
      >>> xr.cftime_range(start='2000', periods=6, freq='2MS', calendar='noleap')
      CFTimeIndex([2000-01-01 00:00:00, 2000-03-01 00:00:00, 2000-05-01 00:00:00,
                   2000-07-01 00:00:00, 2000-09-01 00:00:00, 2000-11-01 00:00:00],
                  dtype='object')
  
      As in the standard pandas function, three of the ``start``, ``end``,
      ``periods``, or ``freq`` arguments must be specified at a given time, with
      the other set to ``None``.  See the `pandas documentation
      <https://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html#pandas.date_range>`_
      for more examples of the behavior of ``date_range`` with each of the
      parameters.
  
      See Also
      --------
      pandas.date_range
      """  # noqa: E501
      # Adapted from pandas.core.indexes.datetimes._generate_range.
      if _count_not_none(start, end, periods, freq) != 3:
          raise ValueError(
              "Of the arguments 'start', 'end', 'periods', and 'freq', three "
              "must be specified at a time.")
  
      if start is not None:
          start = to_cftime_datetime(start, calendar)
          start = _maybe_normalize_date(start, normalize)
      if end is not None:
          end = to_cftime_datetime(end, calendar)
          end = _maybe_normalize_date(end, normalize)
  
      if freq is None:
          dates = _generate_linear_range(start, end, periods)
      else:
          offset = to_offset(freq)
          dates = np.array(list(_generate_range(start, end, periods, offset)))
  
      left_closed = False
      right_closed = False
  
      if closed is None:
          left_closed = True
          right_closed = True
      elif closed == 'left':
          left_closed = True
      elif closed == 'right':
          right_closed = True
      else:
          raise ValueError("Closed must be either 'left', 'right' or None")
  
      if (not left_closed and len(dates) and
              start is not None and dates[0] == start):
          dates = dates[1:]
      if (not right_closed and len(dates) and
              end is not None and dates[-1] == end):
          dates = dates[:-1]
  
      return CFTimeIndex(dates, name=name)