如何以行块的形式检查过程的持续时间?

时间:2019-05-07 00:51:43

标签: python pandas

我需要检查列val1的值是否大于5,并且将这些值至少维持30分钟。然后,我需要知道与大于5的值至少保持30分钟的情况相对应的行块的第一行ID。

这是DataFrame df

date_time             val1
10-12-2018 20:30:00   1
10-12-2018 20:35:00   6
10-12-2018 20:38:00   7
10-12-2018 20:45:00   6
10-12-2018 20:58:00   4
10-12-2018 21:15:00   6   
10-12-2018 21:28:00   8
10-12-2018 21:30:00   7
10-12-2018 22:10:00   6
10-12-2018 22:15:00   4

在此示例中,当val1的值大于5时,我们有两个行块:

第1块:

10-12-2018 20:35:00   6
10-12-2018 20:38:00   7
10-12-2018 20:45:00   6

第2块:

10-12-2018 21:15:00   6   
10-12-2018 21:28:00   8
10-12-2018 21:30:00   7
10-12-2018 22:10:00   6

但是,块1应该丢弃,因为持续时间是10分钟,低于30分钟。在Block 2中,持续时间为55分钟,大于30分钟,因此符合标准。

在此示例中,第一行ID应该为5(在块1:10-12-2018 21:15:00 6中此行的ID)

这就是我尝试解决该问题的方法,但是我的代码不认为行可以合并为块,因为值val1可以上下浮动。

c = "val1"
df.date_time=pd.to_datetime(df.date_time)
maintained = df[df[c]>5][['date_time']]
if len(maintained)>0:
     start = maintained["date_time"].iloc[0]
     end = maintained["date_time"].iloc[len(maintained)-1]
     if (abs(end-start).total_seconds()/60 > 30):
        print(True)
     else:
        print(False)
else:
     print(False)    

1 个答案:

答案 0 :(得分:1)

这是一种方法,一个一个地创建您的条件,首先应将所有大于5的值分组到不同的组中,使用cumsum,然后从每个组中transform获得{{1 }}和min的区别,并按两个条件

过滤组
max

如果您有更多的方块符合条件

将它们保存在s=df.val1.lt(5) df1=df[~s].copy() s1=df1.groupby(s.cumsum()).date_time.transform(lambda x : x.max()-x.min()).dt.seconds yourdf=df1.loc[(s1>1800)] yourdf Out[174]: date_time val1 5 2018-10-12 21:15:00 6 6 2018-10-12 21:28:00 8 7 2018-10-12 21:30:00 7 8 2018-10-12 22:10:00 6

dict