如何在pandas中计算事件之间的时间差

9

原始问题

我遇到了以下问题。我想弄清楚车辆在工厂停留的时间和持续时间。我有一个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" = Home 和 "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]

我使用了next函数来查找Home下一次出现的位置,作为起始位置(即车辆离开基地的时间)。随后,我减去两个日期以找到正确的时间差。

这对于小数据集有效,但对于整个数据集仍然无法运行。


2
你对这个DataFrame的预期输出是什么? - Scott Boston
对于所呈现的框架,这将是:来自第2行的12:41减去来自第1行的10:36,以及来自第7行的10:51减去来自第6行的07:40,存储在一个持续时间列中,该列与初始到达的注册号和日期在同一行。 - jeff
你在意中间的时间步长吗,还是只关心 Dep Loc / Arr Loc == 'Home' 的位置,然后匹配每个相应出发的下一个到达时间? - Peter Mularien
将日期时间戳添加到“Arr Time”和“Dep Time”以查找确切的差异。 - Vijay Anand Pandian
老问题,但是就我而言,我认为通过按注册和路线ID分组,这可能会受益匪浅。 - vmg
显示剩余2条评论
1个回答

1

在筛选相关数据行后,根据“日期”和“天数”列将“到达时间”和“出发时间”转换为时间戳。

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]')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接