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

Python 如何以行块的形式检查进程的持续时间?,python,pandas,Python,Pandas,我需要检查列val1的值是否大于5,并且这些值至少保持30分钟。然后,我需要知道与值大于5的情况对应的行块的第一行id保持至少30分钟 这是数据帧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

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

这是数据帧
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分钟。在区块2中,持续时间为55分钟,大于30分钟,因此符合标准

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

这是我试图解决任务的方法,但是我的代码不考虑行可以在块中合并,因为值<代码> 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)    

这里有一种方法,一个接一个地创建您的条件,首先应该将所有大于5的值分组到不同的组中,使用
cumsum
,然后我们
transform
从每个组中获得
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

如果有更多的块符合条件

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

d={x : y for x , y in yourdf.groupby(s.cumsum())}