Python:时间增量值的分组
Python: Grouping of time-delta values
我正在处理一个详细说明紧急服务轮班工作的数据集。
如果下一个班次的开始时间在上一个班次的 1 小时内,那么我们希望将这些班次组合在一起以求出总时长。如果有多个紧密班次实例,基本上 'chaining' 他们在一起,则此条件适用。这些合并的轮班将共享一个密钥。例如在下面的 table 中,第 3+4 行有一个键,第 5、6、7 行有一个键。
我尝试将这些班次分组在一起的结果是 ['Key'] 列,该列错误地将第 3-7 行分组在一起,即使第 3+4 行之间的时间增量差异大于 1 小时.
所需的输出是 ['Desired_Key'] 列。非常感谢 ideas/solution 中的任何帮助来分解它!
Start Time
End Time
Time till next shift (hrs)
continuing
Key
Desired_Key
1
22/11/2021 20:30
23/11/2021 2:00
2.4
4705
4705
2
23/11/2021 4:23
23/11/2021 9:00
1680.0
4706
4706
3
1/02/2022 9:03
1/02/2022 12:30
0.0
Y
4707
4707
4
1/02/2022 12:30
1/02/2022 14:30
150.6
Y
4707
4707
5
7/02/2022 21:07
7/02/2022 23:55
0.4
Y
4707
4708
6
8/02/2022 0:18
8/02/2022 5:30
0.5
Y
4707
4708
7
8/02/2022 6:00
8/02/2022 8:00
0.0
Y
4707
4708
8
7/10/2021 0:55
7/10/2021 2:55
174.9
4708
4709
9
14/10/2021 9:46
14/10/2021 13:59
18.2
4709
4710
10
15/10/2021 8:10
15/10/2021 13:59
0.7
Y
4710
4711
11
15/10/2021 14:43
15/10/2021 16:43
71.7
Y
4710
4711
12
18/10/2021 16:25
18/10/2021 18:25
24.6
4711
4712
IIUC,第 8 班也应包含在组 [5,6,7] 中。如果是这样,以下应该有效:
import numpy as np
import pandas as pd
df.assign(
Desired_Key = df['Time till next shift (hrs)'].gt(1).cumsum().shift(1, fill_value=0).values + 4505,
continuing = np.where(df['Time till next shift (hrs)'].le(1), 'Y', '')
)
更新:
df.assign(
Desired_Key=df.groupby('ID', as_index=False)['Time till next shift (hrs)']
.apply(lambda x: x.gt(1).shift(1, fill_value=1))
.cumsum()
.sub(1)
.values
+ 4505,
continuing=np.where(
df['ID'].eq(df['ID'].shift(-1)) & df['Time till next shift (hrs)'].le(1),
'Y',
'',
),
)
我正在处理一个详细说明紧急服务轮班工作的数据集。 如果下一个班次的开始时间在上一个班次的 1 小时内,那么我们希望将这些班次组合在一起以求出总时长。如果有多个紧密班次实例,基本上 'chaining' 他们在一起,则此条件适用。这些合并的轮班将共享一个密钥。例如在下面的 table 中,第 3+4 行有一个键,第 5、6、7 行有一个键。
我尝试将这些班次分组在一起的结果是 ['Key'] 列,该列错误地将第 3-7 行分组在一起,即使第 3+4 行之间的时间增量差异大于 1 小时.
所需的输出是 ['Desired_Key'] 列。非常感谢 ideas/solution 中的任何帮助来分解它!
Start Time | End Time | Time till next shift (hrs) | continuing | Key | Desired_Key | |
---|---|---|---|---|---|---|
1 | 22/11/2021 20:30 | 23/11/2021 2:00 | 2.4 | 4705 | 4705 | |
2 | 23/11/2021 4:23 | 23/11/2021 9:00 | 1680.0 | 4706 | 4706 | |
3 | 1/02/2022 9:03 | 1/02/2022 12:30 | 0.0 | Y | 4707 | 4707 |
4 | 1/02/2022 12:30 | 1/02/2022 14:30 | 150.6 | Y | 4707 | 4707 |
5 | 7/02/2022 21:07 | 7/02/2022 23:55 | 0.4 | Y | 4707 | 4708 |
6 | 8/02/2022 0:18 | 8/02/2022 5:30 | 0.5 | Y | 4707 | 4708 |
7 | 8/02/2022 6:00 | 8/02/2022 8:00 | 0.0 | Y | 4707 | 4708 |
8 | 7/10/2021 0:55 | 7/10/2021 2:55 | 174.9 | 4708 | 4709 | |
9 | 14/10/2021 9:46 | 14/10/2021 13:59 | 18.2 | 4709 | 4710 | |
10 | 15/10/2021 8:10 | 15/10/2021 13:59 | 0.7 | Y | 4710 | 4711 |
11 | 15/10/2021 14:43 | 15/10/2021 16:43 | 71.7 | Y | 4710 | 4711 |
12 | 18/10/2021 16:25 | 18/10/2021 18:25 | 24.6 | 4711 | 4712 |
IIUC,第 8 班也应包含在组 [5,6,7] 中。如果是这样,以下应该有效:
import numpy as np
import pandas as pd
df.assign(
Desired_Key = df['Time till next shift (hrs)'].gt(1).cumsum().shift(1, fill_value=0).values + 4505,
continuing = np.where(df['Time till next shift (hrs)'].le(1), 'Y', '')
)
更新:
df.assign(
Desired_Key=df.groupby('ID', as_index=False)['Time till next shift (hrs)']
.apply(lambda x: x.gt(1).shift(1, fill_value=1))
.cumsum()
.sub(1)
.values
+ 4505,
continuing=np.where(
df['ID'].eq(df['ID'].shift(-1)) & df['Time till next shift (hrs)'].le(1),
'Y',
'',
),
)