python - 我想迭代一个循环并计算总时间直到条件持续否则总时间直到条件在python中不持续
问题描述
I have this kind of data:(given below):
[![This is my sample data][1]][1]
RegistrationNo EventType StartDateTime EndDateTime Duration(inMins)
0 MH-04-**-**** Stop 2020-07-13 16:46:00 2020-07-14 04:53:00 727.0
1 MH-04-**-**** Transit 2020-07-14 04:53:00 2020-07-14 06:28:00 95.0
2 MH-04-**-**** Stop 2020-07-14 06:28:00 2020-07-14 06:52:00 24.0
3 MH-04-**-**** Transit 2020-07-14 06:52:00 2020-07-14 07:03:00 11.0
4 MH-04-**-**** Stop 2020-07-14 07:03:00 2020-07-14 07:58:00 55.0
5 MH-04-**-**** Transit 2020-07-14 07:58:00 2020-07-14 10:26:00 148.0
6 MH-04-**-**** Stop 2020-07-14 10:26:00 2020-07-14 10:55:00 29.0
7 MH-04-**-**** Transit 2020-07-14 10:55:00 2020-07-14 11:15:00 20.0
8 MH-04-**-**** Stop 2020-07-14 11:15:00 2020-07-14 11:59:00 44.0
9 MH-04-**-**** Transit 2020-07-14 11:59:00 2020-07-14 12:03:00 4.0
10 MH-04-**-**** Stop 2020-07-14 12:03:00 2020-07-14 16:18:00 255.0
11 MH-04-**-**** Transit 2020-07-14 16:18:00 2020-07-14 16:19:00 1.0
12 MH-04-**-**** Stop 2020-07-14 16:19:00 2020-07-14 16:39:00 20.0
13 MH-04-**-**** Transit 2020-07-14 16:39:00 2020-07-14 18:20:00 101.0
14 MH-04-**-**** Stop 2020-07-14 18:20:00 2020-07-14 20:22:00 122.0
15 MH-04-**-**** Transit 2020-07-14 20:22:00 2020-07-14 21:41:00 79.0
16 MH-04-**-**** Stop 2020-07-14 21:41:00 2020-07-15 05:52:00 491.0
17 MH-04-**-**** Transit 2020-07-15 05:52:00 2020-07-15 07:37:00 105.0
18 MH-04-**-**** Stop 2020-07-15 07:37:00 2020-07-16 05:17:00 1300.0
19 MH-04-**-**** Transit 2020-07-16 05:17:00 2020-07-16 06:23:00 66.0
20 MH-04-**-**** Stop 2020-07-16 06:23:00 2020-07-16 08:11:00 108.0
21 MH-04-**-**** Transit 2020-07-16 08:11:00 2020-07-16 08:13:00 2.0
22 MH-04-**-**** Stop 2020-07-16 08:14:00 2020-07-16 09:22:00 68.0
23 MH-04-**-**** Transit 2020-07-16 09:22:00 2020-07-16 09:28:00 6.0
24 MH-04-**-**** Stop 2020-07-16 09:28:00 2020-07-16 09:45:00 17.0
我想制作一个程序,我想每 4 小时检查一次它需要多少时间休息,如果它的总休息时间不超过 1 小时,那么它连续驾驶了多少时间,忽略总休息时间少于第一个 4 小时间隔 60 分钟/1 小时休息。
一些细节点:
连续驾驶超过 4 小时且没有休息至少 1 小时。1小时的休息时间可以分为15分钟的休息时间。
连续驾驶超过4小时,每1小时计1次。例如,如果车辆连续行驶 5 小时 2 分钟,则计数将为 2(第 5 小时和第 6 小时的 2 分钟)
我尝试了很多事情,但无法涵盖所有条件。
请帮助,现在你们只是希望!提前致谢!
解决方案
我想您想知道的是,在任何 5 小时内是否有超过 4 小时的驾驶时间。因为它将在少于 1 个休息小时的情况下表征任何 4 个驾驶小时。
这可以通过首先以 1 分钟的频率重新采样原始数据,然后在 5 小时的传输分钟数上使用滚动和来获得。
在 Pandas 中,它可以提供:
tmp = df.assign(Transit=(df['EventType'] == 'Transit')
).set_index('StartDateTime')['Transit'].append(
pd.Series([df.iloc[-1]['EventType'] == 'Transit'],
index=[df.iloc[-1]['EndDateTime']])
).resample('1T').ffill().iloc[:-1].rolling('5H').sum().astype('int32')
公式详情:
assign(Transit=(df['EventType'] == 'Transit')
以可总结的方式确定运输时间set_index('StartDateTime')['Transit']
使用日期时间索引来简化重新采样,并且只考虑新Transit
列(True == transit time)append(pd.Series([df.iloc[-1]['Transit']], index=[df.iloc[-1]['EndDateTime']])
将系列延长到最后一个时期的末尾resample('1T').ffill().iloc[:-1]
以 1 分钟的间隔重新采样并删除最后一分钟(否则最后一个时间段将是 1 分钟太长)rolling('5H').sum()
将每 5 小时的总行驶时间相加astype('int32')
sum()
当 int32 足够时给出 float64
您现在可以简单地测试违规行为tmp[tmp > 240]
。使用您的样本,它会给出一个空系列。
为了识别不同的违规行为,我无法想象一种矢量化的方式,所以我会在以下时间回退到一个好的旧 Python 循环tmp > 240
:
infrac = []
last = None
for i in tmp[tmp > 240].index:
if (last is None) or (i >= last + pd.Timedelta('1H')): # one hour delay
infrac.append(i)
last = i
但我无法进行太多测试,因为样本不包含任何违规行为......
错过了重点的原始答案:
我可以设法计算每个包含至少一些过境的 4 小时序列的总休息时间。我假设数据框不包含 4 小时或更长时间的传输序列。这意味着在使用以下代码之前,应使用以下代码识别长驾驶序列:
df[(df['EventType'] == 'Transit')&(df['Duration(inMins)'] >= 240.)]
使用显示数据示例,上述查询返回一个空数据框。
我rolling
用来识别 4 小时的序列。因为它使用右端,所以我将它应用在EndDateTime
. 由于只需要计算 4 小时内的休息时间,因此我使用了自定义计算函数。
代码是:
def sum_stop(x):
x = df.loc[x.index]
start = x.iloc[-1]['EndDateTime']-pd.Timedelta('4H')
x = x[x['EventType'] == 'Stop']
stop = np.where(x['StartDateTime']>=start, x['Duration(inMins)'],
(x['EndDateTime']-start).dt.total_seconds()/60.)
return np.sum(stop)
df['BreakInPrevious4H'] = df.rolling('4H', on='EndDateTime')['Duration(inMins)'].apply(sum_stop)
它给:
RegistrationNo EventType StartDateTime EndDateTime Duration(inMins) BreakPrevious4H
0 MH-04-**-**** Stop 2020-07-13 16:46:00 2020-07-14 04:53:00 727.0 240.0
1 MH-04-**-**** Transit 2020-07-14 04:53:00 2020-07-14 06:28:00 95.0 145.0
2 MH-04-**-**** Stop 2020-07-14 06:28:00 2020-07-14 06:52:00 24.0 145.0
3 MH-04-**-**** Transit 2020-07-14 06:52:00 2020-07-14 07:03:00 11.0 134.0
4 MH-04-**-**** Stop 2020-07-14 07:03:00 2020-07-14 07:58:00 55.0 134.0
5 MH-04-**-**** Transit 2020-07-14 07:58:00 2020-07-14 10:26:00 148.0 79.0
6 MH-04-**-**** Stop 2020-07-14 10:26:00 2020-07-14 10:55:00 29.0 84.0
7 MH-04-**-**** Transit 2020-07-14 10:55:00 2020-07-14 11:15:00 20.0 72.0
8 MH-04-**-**** Stop 2020-07-14 11:15:00 2020-07-14 11:59:00 44.0 73.0
9 MH-04-**-**** Transit 2020-07-14 11:59:00 2020-07-14 12:03:00 4.0 73.0
10 MH-04-**-**** Stop 2020-07-14 12:03:00 2020-07-14 16:18:00 255.0 240.0
11 MH-04-**-**** Transit 2020-07-14 16:18:00 2020-07-14 16:19:00 1.0 239.0
12 MH-04-**-**** Stop 2020-07-14 16:19:00 2020-07-14 16:39:00 20.0 239.0
13 MH-04-**-**** Transit 2020-07-14 16:39:00 2020-07-14 18:20:00 101.0 138.0
14 MH-04-**-**** Stop 2020-07-14 18:20:00 2020-07-14 20:22:00 122.0 139.0
15 MH-04-**-**** Transit 2020-07-14 20:22:00 2020-07-14 21:41:00 79.0 122.0
16 MH-04-**-**** Stop 2020-07-14 21:41:00 2020-07-15 05:52:00 491.0 240.0
17 MH-04-**-**** Transit 2020-07-15 05:52:00 2020-07-15 07:37:00 105.0 135.0
18 MH-04-**-**** Stop 2020-07-15 07:37:00 2020-07-16 05:17:00 1300.0 240.0
19 MH-04-**-**** Transit 2020-07-16 05:17:00 2020-07-16 06:23:00 66.0 174.0
20 MH-04-**-**** Stop 2020-07-16 06:23:00 2020-07-16 08:11:00 108.0 174.0
21 MH-04-**-**** Transit 2020-07-16 08:11:00 2020-07-16 08:13:00 2.0 172.0
22 MH-04-**-**** Stop 2020-07-16 08:14:00 2020-07-16 09:22:00 68.0 176.0
23 MH-04-**-**** Transit 2020-07-16 09:22:00 2020-07-16 09:28:00 6.0 176.0
24 MH-04-**-**** Stop 2020-07-16 09:28:00 2020-07-16 09:45:00 17.0 193.0
补充说明:超过 4 小时的停留时间未在BreakPrevious4H
列中特别注明,但实际持续时间在Duration(inMins)
(第 0、10、16 和 18 行)。
推荐阅读
- bazaar - git bundle --all 的集市中的等价物是什么?
- javascript - 编写一个返回不同字母组合的函数
- java - 有没有办法只能解析字符串的一部分?
- hyperledger-fabric - 为区块链应用程序制作开发和部署环境。所需工具
- android - 使用 retrofit2 恢复失败的下载
- oracle - 将 Hibernate 与 Spring Boot、Wildfly 和 Oracle DB 结合使用
- ruby - 用多个分隔符拆分字符串
- symfony - 动态服务使用
- r - 选择具有特定列匹配条件的行
- python - 用于登录网站的 Python 脚本不输入登录信息