I am dealing with dividing a day into working shifts. Let’s have a look at my sample code:
I’d like to divide the time into 3 shifts, 00:00 to 08:00 is Shift1, 08:00 to 16:00 will be Shift2 and till 00:00 will be Shift3.
What I get is true, but I would like to know if there is any elegant and easier way to do it?
JavaScriptx11111In:
2import pandas as pd
3
4data = [['24.12.2020 05:17:32', 6], ['24.12.2020 07:20:06', 5],
5['24.12.2020 09:33:29', 9],['24.12.2020 14:21:54', 12],
6['24.12.2020 18:52:01', 11],['24.12.2020 22:05:19', 4]]
7
8df = pd.DataFrame(data, columns = ['DateTime', 'Counter'])
9
10print(df)
11
the dataframe looks like:
JavaScript191Out:
2DateTime Counter
30 24.12.2020 05:17:32 6
41 24.12.2020 07:20:06 5
52 24.12.2020 09:33:29 9
63 24.12.2020 14:21:54 12
74 24.12.2020 18:52:01 11
85 24.12.2020 22:05:19 4
9
JavaScript122221In:
2
3df['DateTime'] = pd.to_datetime(df['DateTime'])
4df['Hour'] = df['DateTime'].dt.hour
5df['Hour'] = pd.to_numeric(df['Hour'],downcast="float")
6
7df['Shift1'] = (df['Hour']<8)
8df['Shift2'] = (df['Hour']>=8) & (df['Hour']<16)
9df['Shift3'] = (df['Hour']>=16)
10
11df['Shift1'] = df['Shift1'].astype(int)
12df['Shift2'] = df['Shift2'].astype(int)
13df['Shift3'] = df['Shift3'].astype(int)
14
15df['Shift1'] = df['Shift1'].replace([1,0], ['Shift1',''])
16df['Shift2'] = df['Shift2'].replace([1,0], ['Shift2',''])
17df['Shift3'] = df['Shift3'].replace([1,0], ['Shift3',''])
18
19df['SHIFTS'] = df['Shift1']+df['Shift2']+df['Shift3']
20
21print(df)
22
JavaScript191Out:
2DateTime Counter Hour Shift1 Shift2 Shift3 SHIFTS
30 2020-12-24 05:17:32 6 5.0 Shift1 Shift1
41 2020-12-24 07:20:06 5 7.0 Shift1 Shift1
52 2020-12-24 09:33:29 9 9.0 Shift2 Shift2
63 2020-12-24 14:21:54 12 14.0 Shift2 Shift2
74 2020-12-24 18:52:01 11 18.0 Shift3 Shift3
85 2020-12-24 22:05:19 4 22.0 Shift3 Shift3
9
Advertisement
Answer
Try to create SHIFTS
column before then pivot your dataframe:
JavaScript
1
4
1
df['SHIFTS'] = df['DateTime'].astype('datetime64').dt.hour
2
.floordiv(8).add(1).astype(str).radd('shift')
3
df = df.join(df.reset_index().pivot('index', 'SHIFTS', 'SHIFTS')).fillna('')
4
Output:
JavaScript
1
9
1
>>> df
2
DateTime Counter SHIFTS shift1 shift2 shift3
3
0 24.12.2020 05:17:32 6 shift1 shift1
4
1 24.12.2020 07:20:06 5 shift1 shift1
5
2 24.12.2020 09:33:29 9 shift2 shift2
6
3 24.12.2020 14:21:54 12 shift2 shift2
7
4 24.12.2020 18:52:01 11 shift3 shift3
8
5 24.12.2020 22:05:19 4 shift3 shift3
9