python - 如何以行块的形式检查进程的持续时间?
问题描述
我需要检查该列val1
的值是否大于 5,并且这些值是否至少保持 30 分钟。然后我需要知道与大于 5 的值保持至少 30 分钟的情况相对应的行块的第一行 ID。
这是数据框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
但是,Block 1 应该被丢弃,因为持续时间是 10 分钟,低于 30 分钟。在 Block 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
如果您有更多符合条件的块
将它们保存在dict
d={x : y for x , y in yourdf.groupby(s.cumsum())}
推荐阅读
- google-api - Googleapis / Jquery 循环在 Macbook Air 上停止工作
- django - 如何向 Django Admin 添加自定义查询/查询集?
- laravel - 如何解决“未定义回声”错误?
- python - Selenium Python 使用代理运行浏览器
- python - 尝试从 Python 代码向 XSLT 文件传递参数时获取“xsltCompilePattern”
- python - Heroku Django 错误:SSL 证书已过期
- python - 如果单元格的长度在 python 中为 2,则在列中添加前导零
- firebase - 回收站视图不再加载
- java - 如何隐藏所有活动的导航栏?安卓工作室
- loops - 遍历ansible中的值