code: def decode_cf_datetime(num_dates, units, calendar=None, use_cftime=None):
      
      num_dates = np.asarray(num_dates)
      flat_num_dates = num_dates.ravel()
      if calendar is None:
          calendar = 'standard'
  
      if use_cftime is None:
          try:
              dates = _decode_datetime_with_pandas(flat_num_dates, units,
                                                   calendar)
          except (OutOfBoundsDatetime, OverflowError):
              dates = _decode_datetime_with_cftime(
                  flat_num_dates.astype(np.float), units, calendar)
  
              if (dates[np.nanargmin(num_dates)].year < 1678 or
                 dates[np.nanargmax(num_dates)].year >= 2262):
                  if calendar in _STANDARD_CALENDARS:
                      warnings.warn(
                          'Unable to decode time axis into full '
                          'numpy.datetime64 objects, continuing using '
                          'cftime.datetime objects instead, reason: dates out '
                          'of range', SerializationWarning, stacklevel=3)
              else:
                  if calendar in _STANDARD_CALENDARS:
                      dates = cftime_to_nptime(dates)
      elif use_cftime:
          dates = _decode_datetime_with_cftime(
              flat_num_dates.astype(np.float), units, calendar)
      else:
          dates = _decode_datetime_with_pandas(flat_num_dates, units, calendar)
  
      return dates.reshape(num_dates.shape)
docs: Given an array of numeric dates in netCDF format, convert it into a
      numpy array of date time objects.
  
      For standard (Gregorian) calendars, this function uses vectorized
      operations, which makes it much faster than cftime.num2date. In such a
      case, the returned array will be of type np.datetime64.
  
      Note that time unit in `units` must not be smaller than microseconds and
      not larger than days.
  
      See also
      --------
      cftime.num2date