Как создать новые столбцы из Pandas datetime - PullRequest
1 голос
/ 06 мая 2020

У меня есть df кадра данных со столбцом datetime. Общий фрейм данных содержит 20 миллионов строк, для удобства я просто беру 3 строки.

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,3), unit='h', origin='2018-08-01 00:00:00')

                 Date
0 2018-08-01 00:00:00
1 2018-08-01 01:00:00
2 2018-08-01 02:00:00

С даты и времени я хотел бы создать новые столбцы '00_hrs', '01_hrs', '02_hrs', (et c. До '23_hrs'), где значения равны 0 или 1. 1, когда час данного datetime применим к часу, указанному в столбце, и 0 в противном случае.

Результат должен выглядеть так:

                 Date 00_hrs  01_hrs 02_hrs ... 23_hrs
0 2018-08-01 00:00:00    1      0     0          0
1 2018-08-01 01:00:00    0      1     0          0
2 2018-08-01 02:00:00    0      0     1          0 

1 Ответ

2 голосов
/ 06 мая 2020

Используйте get_dummies с часами, сгенерированными Series.dt.strftime, а затем добавьте к оригиналу DataFrame.join:

df = df.join(pd.get_dummies(df['Date'].dt.strftime('%H_hrs')))
print (df)
                 Date  00_hrs  01_hrs  02_hrs
0 2018-08-01 00:00:00       1       0       0
1 2018-08-01 01:00:00       0       1       0
2 2018-08-01 02:00:00       0       0       1

Если возможно, несколько часов пропущены, возможно, добавьте их по DataFrame.reindex:

hours = [f'{n:02}_hrs' for n in range(24)]
df = (df.join(pd.get_dummies(df['Date'].dt.strftime('%H_hrs'))
                .reindex(hours, axis=1, fill_value=0)))
print (df)
                 Date  00_hrs  01_hrs  02_hrs  03_hrs  04_hrs  05_hrs  06_hrs  \
0 2018-08-01 00:00:00       1       0       0       0       0       0       0   
1 2018-08-01 01:00:00       0       1       0       0       0       0       0   
2 2018-08-01 02:00:00       0       0       1       0       0       0       0   

   07_hrs  08_hrs  09_hrs  10_hrs  11_hrs  12_hrs  13_hrs  14_hrs  15_hrs  \
0       0       0       0       0       0       0       0       0       0   
1       0       0       0       0       0       0       0       0       0   
2       0       0       0       0       0       0       0       0       0   

   16_hrs  17_hrs  18_hrs  19_hrs  20_hrs  21_hrs  22_hrs  23_hrs  
0       0       0       0       0       0       0       0       0  
1       0       0       0       0       0       0       0       0  
2       0       0       0       0       0       0       0       0  
...