docs: def interpolate_to_timestep(self, timestep, cumulative=None):
          """Interpolate data for a finer timestep using a linear interpolation.
  
          Args:
              timestep: Target timestep as an integer. Target timestep must be
                  divisable by current timestep.
              cumulative: A boolean that sets whether the interpolation
                  should treat the data colection values as cumulative, in
                  which case the value at each timestep is the value over
                  that timestep (instead of over the hour). The default will
                  check the DataType to see if this type of data is typically
                  cumulative over time.
  
          Return:
              A continuous hourly data collection with data interpolated to
                  the input timestep.
          """
          assert timestep % self.header.analysis_period.timestep == 0, \
              'Target timestep({}) must be divisable by current timestep({})' \
              .format(timestep, self.header.analysis_period.timestep)
          if cumulative is not None:
              assert isinstance(cumulative, bool), \
                  'Expected Boolean. Got {}'.format(type(cumulative))
  
          # generate new data
          _new_values = []
          _data_length = len(self._values)
          for d in xrange(_data_length):
              for _v in self._xxrange(self[d], self[(d + 1) % _data_length], timestep):
                  _new_values.append(_v)
  
          # divide cumulative values by the timestep
          native_cumulative = self.header.data_type.cumulative
          if cumulative is True or (cumulative is None and native_cumulative):
              for i, d in enumerate(_new_values):
                  _new_values[i] = d / timestep
  
          # shift data by a half-hour if data is averaged or cumulative over an hour
          if self.header.data_type.point_in_time is False:
              shift_dist = int(timestep / 2)
              _new_values = _new_values[-shift_dist:] + _new_values[:-shift_dist]
  
          # build a new header
          a_per = self.header.analysis_period
          _new_a_per = AnalysisPeriod(a_per.st_month, a_per.st_day, a_per.st_hour,
                                      a_per.end_month, a_per.end_day, a_per.end_hour,
                                      timestep, a_per.is_leap_year)
          _new_header = self.header.duplicate()
          _new_header._analysis_period = _new_a_per
          return HourlyContinuousCollection(_new_header, _new_values)