Leaves only the latest version for each object.
        Adds a new column which represents age.
        The age is computed by subtracting _start of the oldest version
        from one of these possibilities::

            # psuedo-code
            if self._rbound is None:
                if latest_version._end is pd.NaT:
                    current_time is used
                else:
                    min(current_time, latest_version._end) is used
            else:
                if latest_version._end is pd.NaT:
                    self._rbound is used
                else:
                    min(self._rbound, latest_version._end) is used

        :param index: name of the new column.

def last_versions_with_age(self, col_name='age'):
        '''
        Leaves only the latest version for each object.
        Adds a new column which represents age.
        The age is computed by subtracting _start of the oldest version
        from one of these possibilities::

            # psuedo-code
            if self._rbound is None:
                if latest_version._end is pd.NaT:
                    current_time is used
                else:
                    min(current_time, latest_version._end) is used
            else:
                if latest_version._end is pd.NaT:
                    self._rbound is used
                else:
                    min(self._rbound, latest_version._end) is used

        :param index: name of the new column.
        '''
        min_start_map = {}
        max_start_map = {}
        max_start_ser_map = {}

        cols = self.columns.tolist()
        i_oid = cols.index('_oid')
        i_start = cols.index('_start')
        i_end = cols.index('_end')
        for row in self.values:
            s = row[i_start]
            oid = row[i_oid]
            mins = min_start_map.get(oid, s)
            if s <= mins:
                min_start_map[oid] = s
            maxs = max_start_map.get(oid, s)
            if s >= maxs:
                max_start_map[oid] = s
                max_start_ser_map[oid] = row

        vals = max_start_ser_map.values()
        cut_ts = datetime.utcnow()
        ages = []
        for row in vals:
            end = row[i_end]
            end = cut_ts if end is pd.NaT else min(cut_ts, end)
            age = end - min_start_map[row[i_oid]]
            age = age - timedelta(microseconds=age.microseconds)
            ages.append(age)

        res = pd.DataFrame(max_start_ser_map.values(), columns=cols)
        res[col_name] = pd.Series(ages, index=res.index)
        return res