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

Posted

技术标签:

【中文标题】如何计算熊猫事件之间的时间【英文标题】:How to calculate time between events in a pandas 【发布时间】:2017-12-31 15:41:06 【问题描述】:

原始问题

我陷入了以下问题。我试图弄清楚车辆在工厂的哪个时间点以及多长时间。我有一个 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

我创建了一个脚本,其中处理了所有日期和时间,以便为到达和离开日期时间创建正确的日期时间列。对于维护期:"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 行的 12:41 减去第 1 行的 10:36 和第 7 行的 10:51 减去第 6 行的 07:40,存储在持续时间中在同一行的列中包含注册号和初始到达日期 您关心中间的时间步长,还是只关心 Dep Loc / Arr Loc == 'Home' 的位置,然后为每个相应的出发时间匹配下一次到达? 添加带有Arr TimeDep Time 的日期戳以找出确切的差异。 【参考方案1】:

过滤相关数据行后,根据“Date”和“Days”列将“Arr time”和“Dep time”转换为时间戳

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

【讨论】:

以上是关于如何计算熊猫事件之间的时间的主要内容,如果未能解决你的问题,请参考以下文章

随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量

python3 - 熊猫确定事件发生是不是具有统计意义

熊猫日期和事件

绘制熊猫时间增量

计算事件之间的时间

熊猫 - 彼此靠近的分桶事件