rs = pd.DataFrame(index=df.resample('15min').iloc[1:].index)
idx_after = np.searchsorted(df.index.values, rs.index.values)
rs['after'] = df.loc[df.index[idx_after], 'Values'].values
rs['before'] = df.loc[df.index[idx_after - 1], 'Values'].values
rs['after_time'] = df.index[idx_after]
rs['before_time'] = df.index[idx_after - 1]
rs['span'] = rs['after_time'] - rs['before_time']
rs['after_weight'] = (rs['after_time'] - rs.index) / rs['span']
rs['before_weight'] = (pd.Series(data=rs.index, index=rs.index) - rs[
    'before_time']) / rs['span']
rs['Values'] = rs.eval('before * before_weight + after * after_weight')
Python упорядочивает нерегулярные временные ряды с помощью линейной интерполяции