如何计算熊猫事件之间的时间

jef*_*eff 7 python datetime time-series timedelta pandas

原始问题

我坚持以下问题.我正在试图弄清楚车辆在哪个时刻和工厂停留多长时间.我有一张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
Run Code Online (Sandbox Code Playgroud)

我创建了一个脚本,其中处理日期和时间以创建到达和离开日期时间的正确日期时间列.对于维护期:"Dep Loc"= Home和"Arr Loc"= Home,以下代码用于挑出相关的行:

df_home = df[df["Dep Loc"].isin(["Home"])]
df_home = df_home[df_home["Arr Loc"].isin(["Home"])]
Run Code Online (Sandbox Code Playgroud)

从这里我可以轻松地减去创建持续时间列的日期.

到现在为止还挺好.但是,我坚持使用计算其他时间.这是因为可能存在中间停止,因此.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]
Run Code Online (Sandbox Code Playgroud)

在这里,我使用下一个函数来查找Home的下一个出现位置(即车辆离开基座的时间).随后我减去两个日期以找到适当的时差.

它适用于小数据集,但不适用于整个数据集.

小智 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')
Run Code Online (Sandbox Code Playgroud)

最后,“出发时间”和“到达时间”之间的差异将给出持续时间(以分钟为单位)

df_home['diff_duration']=(df_home['Dep Time']-df_home['Arr Time']).astype('timedelta64[m]')
Run Code Online (Sandbox Code Playgroud)