gpt4 book ai didi

python - 如何以行 block 的形式检查进程的持续时间?

转载 作者:行者123 更新时间:2023-12-01 07:55:12 25 4
gpt4 key购买 nike

我需要检查列 val1 的值是否大于 5,并且这些值至少保留 30 分钟。然后我需要知道大于 5 的值保持至少 30 分钟的情况对应的行 block 的第一行 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 时,我们有两个行 block :

block 1:

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

block 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( block 1 中该行的 id:10-12-2018 21:15:00 6)

这就是我尝试解决该任务的方法,但是我的代码不认为行可以合并到 block 中,因为值 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 ,然后我们对每个值进行转换组获取 minmax 差异,并按这两个条件过滤组

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
<小时/>

如果您有更多符合条件的 block

将它们保存在dict

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

关于python - 如何以行 block 的形式检查进程的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com