вы можете сделать это с помощью set_index
с первым уровнем только time
из столбца datetime и вторым уровнем date
того же столбца. Затем unstack
:
#sample dataframe
np.random.seed(1)
drange = pd.date_range('2019-01-01 09:30:00', freq='5T', periods=5)
df = pd.DataFrame({'datetime': drange.tolist() + (drange+pd.DateOffset(days=1)).tolist(),
'Value_1':np.random.randint(10, size=10),})
print (df)
datetime Value_1
0 2019-01-01 09:30:00 5
1 2019-01-01 09:35:00 8
2 2019-01-01 09:40:00 9
3 2019-01-01 09:45:00 5
4 2019-01-01 09:50:00 0
5 2019-01-02 09:30:00 0
6 2019-01-02 09:35:00 1
7 2019-01-02 09:40:00 7
8 2019-01-02 09:45:00 6
9 2019-01-02 09:50:00 9
# set_index and unstack
df_f = df.set_index([df['datetime'].dt.time,
df['datetime'].dt.date])['Value_1']\
.unstack()
print (df_f)
datetime 2019-01-01 2019-01-02
datetime
09:30:00 5 0
09:35:00 8 1
09:40:00 9 7
09:45:00 5 6
09:50:00 0 9
Затем, если вы хотите создать все 5 минут в индексе и каждый день в столбце, вы можете использовать reindex
и ffill
:
df_f = df_f.reindex(index=pd.date_range('2019-01-01 00:00:00',
freq='5T', periods=288).time,
columns=pd.date_range('2019-01-01',
freq='D', periods=365).date)\
.ffill()