我陷入了以下问题。我试图找出工厂中的哪个时间以及车辆停放了多长时间。我有一张Excel工作表,其中存储了所有事件,这些事件要么是交货路线,要么是维护事件。最终目的是获得一个数据框,在该数据框中给出车辆登记号以及相应的到达工厂的时间以及在工厂所花费的时间(包括维护措施)。对于感兴趣的人,这是因为我最终希望能够安排车辆的非关键维护行动。
我的数据框的一个例子是:
Registration RoutID Date Dep Loc Arr Loc Dep Time Arr Time Days
0 XC66 A58 20/May/17 Home Loc A 10:54 21:56 0
1 XC66 A59 21/May/17 Loc A Home 00:12 10:36 0
2 XC66 A345 21/May/17 Home Loc B 12:41 19:16 0
3 XC66 A346 21/May/17 Loc B Loc C 20:50 03:49 1
4 XC66 A347 22/May/17 Loc C Home 06:10 07:40 0
5 XC66 #M1 22/May/17 Home Home 10:51 13:00 0
我创建了一个脚本,其中所有日期和时间都经过处理,以为到达和离开日期时间创建正确的datetime列。对于维护周期:“ Dep Loc” =主页,“ Arr Loc” = Home,下面的代码用于选择相关行:
df_home = df[df["Dep Loc"].isin(["Home"])]
df_home = df_home[df_home["Arr Loc"].isin(["Home"])]
从这里我可以轻松减去日期以创建工期列。
到目前为止很好。但是,我坚持使用其他时间进行计算。这是因为可能会有中间的停靠点,所以.shift()函数不起作用,因为要移动的行数不是恒定的。
我试图对此事进行搜索,但是我只能找到基于内部事件时间而不是事件之间时间的轮班解决方案或答案。
朝正确方向的任何指导将不胜感激!
问候
我已经在这个问题上停留了一段时间,但在发布此问题后不久,我尝试了此解决方案:
for idx, loc in enumerate(df["Arr Loc"]):
if loc == "Home":
a = ((idx2, obj) for idx2, obj in enumerate(df["Dep Loc"]) if (obj == "Home" and idx2 > idx))
idx_next = next(a)
idx_next = idx_next[0]
Arrival_times = df["Arr Time"]
Departure_times = df["Dep Time"]
Duration = Arrival_times[idx] - Departure_times[idx_next]
[这里,我使用了下一个函数来查找下一个出现的Home位置,作为起始位置(即车辆离开基地的时间)。随后,我减去两个日期以找到适当的时差。
它适用于小型数据集,但不适用于整个数据集。
[过滤了相关数据行后,根据“日期”和“天”列将“到达时间”和“深度时间”转换为时间戳记
df_home = df[df["Dep Loc"].isin(["Home"])]
df_home = df_home[df_home["Arr Loc"].isin(["Home"])]
df_home['Dep Time']=df_home['Date']+' '+df_home['Dep Time']
df_home['Arr Time']=df_home['Date']+' '+df_home['Arr Time']
df_home['Date']=pd.to_datetime(df_home['Date'])
df_home['Dep Time']=pd.to_datetime(df_home['Dep Time'])
df_home['Arr Time']=pd.to_datetime(df_home['Arr Time'])
df_home['Dep Time']=pd.to_datetime(df_home['Dep Time'])+pd.to_timedelta(df_home['Days'], unit='d')
最后,“ Dep time”和“ Arr time”之间的差将给出持续时间(以分钟为单位)
df_home['diff_duration']=(df_home['Dep Time']-df_home['Arr Time']).astype('timedelta64[m]')