Для использования решения numpy я не нашел встроенного решения, использующего сдвиг путем ссылки на список ввода, но мы можем использовать this превосходный ответ вежливости @Divakar и использовать его, чтобы получить наш решение путем создания необходимых массивов из нашего фрейма данных:
cols = df.columns[2:]
mat = np.ones((len(df),len(cols))) * df['temp'][:,None]
r = np.arange(1,len(cols)+1)
df[cols]=strided_indexing_roll(mat.T,r).T
print(df)
datetime temp T1 T2 T3 T4 T5
0 2020-01-04 02:53:00+00:00 58 0.0 0.0 0.0 0.0 0.0
1 2020-01-04 03:53:00+00:00 51 58.0 0.0 0.0 0.0 0.0
2 2020-01-04 04:53:00+00:00 49 51.0 58.0 0.0 0.0 0.0
3 2020-01-04 05:53:00+00:00 48 49.0 51.0 58.0 0.0 0.0
4 2020-01-04 06:00:00+00:00 48 48.0 49.0 51.0 58.0 0.0
5 2020-01-04 06:53:00+00:00 47 48.0 48.0 49.0 51.0 58.0
Примечание: Измените строку p = np.full((a.shape[0],a.shape[1]-1),np.nan)
на p = np.full((a.shape[0],a.shape[1]-1),0)
в функции.