Python 检查一段时间内是否满足条件

Python 检查一段时间内是否满足条件,python,pandas,datetime,Python,Pandas,Datetime,我试图找出在一段时间内是否满足某些条件。我的数据如下所示: 日期时间 阀门1 阀门2 01/01/2020 11:00:01 1. 0 01/01/2020 11:00:15 1. 0 01/01/2020 11:30:00 1. 0 01/01/2020 11:30:45 1. 0 01/01/2020 12:00:10 1. 0 01/01/2020 12:15:00 1. 1. 01/01/2020 12:15:30 1. 0 01/01/2020 12:16:45 1. 0 01/01/

我试图找出在一段时间内是否满足某些条件。我的数据如下所示:

日期时间 阀门1 阀门2 01/01/2020 11:00:01 1. 0 01/01/2020 11:00:15 1. 0 01/01/2020 11:30:00 1. 0 01/01/2020 11:30:45 1. 0 01/01/2020 12:00:10 1. 0 01/01/2020 12:15:00 1. 1. 01/01/2020 12:15:30 1. 0 01/01/2020 12:16:45 1. 0 01/01/2020 13:17:00 1. 0 01/01/2020 13:20:15 1. 0 01/01/2020 13:21:30 1. 0 01/01/2020 13:45:08 1. 0 01/01/2020 14:00:00 0 1. 01/01/2020 14:01:15 0 1. 01/01/2020 14:30:00 0 1.
你说你不能对你的数据重新取样,你可以这样做如下

>>> temp_df = pd.concat([df.copy().iloc[0, :].to_frame().T, df.copy()], axis=0, ignore_index=True)
# added this line to add initialization effect
>>> temp_df.loc[0, ['Valve1', 'Valve2']] = [0, 1]
>>> temp_df['alarm'] = temp_df.Valve1.eq(1) & temp_df.Valve2.eq(0)
>>> df['alarm'] = temp_df.set_index('Datetime').rolling('1h').agg({'alarm': pd.Series.product}).replace({1: 'Yes', 0: 'No'})[1:].values
>>> df

              Datetime  Valve1  Valve2 alarm
0  2020-01-01 11:00:01       1       0    No
1  2020-01-01 11:00:15       1       0    No
2  2020-01-01 11:30:00       1       0    No
3  2020-01-01 11:30:45       1       0    No
4  2020-01-01 12:00:10       1       0   Yes
5  2020-01-01 12:15:00       1       1    No
6  2020-01-01 12:15:30       1       0    No
7  2020-01-01 12:16:45       1       0    No
8  2020-01-01 13:17:00       1       0   Yes
9  2020-01-01 13:20:15       1       0   Yes
10 2020-01-01 13:21:30       1       0   Yes
11 2020-01-01 13:45:08       1       0   Yes
12 2020-01-01 14:00:00       0       1    No
13 2020-01-01 14:01:15       0       1    No
14 2020-01-01 14:30:00       0       1    No
现在应该可以了。

  • 使用
    groupby()
    date()hour
  • 使用逻辑给出bool结果
  • merge()
    返回数据帧
日期时间 阀门1 阀门2 康德 0 2020-01-01 11:00:01 1. 0 真的 1. 2020-01-01 11:00:15 1. 0 真的 2. 2020-01-01 11:30:00 1. 0 真的 3. 2020-01-01 11:30:45 1. 0 真的 4. 2020-01-01 12:00:10 1. 1. 假的 5. 2020-01-01 12:15:00 1. 1. 假的 6. 2020-01-01 12:15:30 1. 1. 假的 7. 2020-01-01 12:16:45 0 1. 假的 8. 2020-01-01 13:17:00 1. 0 真的 9 2020-01-01 13:20:15 1. 0 真的 10 2020-01-01 13:21:30 1. 0 真的 11 2020-01-01 13:45:08 1. 0 真的 12 2020-01-01 14:00:00 0 1. 假的 13 2020-01-01 14:01:15 0 1. 假的 14 2020-01-01 14:30:00 0 1. 假的
为什么不需要使用重采样和缺失的日期时间值?我的意思是不增加/减少数据帧的大小,因为数据帧将被可视化我想可视化原始数据而不是重采样数据为什么11am没有报警?11am是我需要检查valve1是否在[10am-11am]之间的第一个数据点始终为1,[10am-11am]之间的valve2始终为0,但我在11点之前没有任何数据,我猜他正在尝试检查每个记录的最后1小时的条件。谢谢,但是valve1应在1小时内等于1,valve2应在1小时内等于0。请看一下更新的数据和结果表哦,我知道了。然后让我调整我的答案。好的,我知道了,我们可以使用rolling.product,通过添加不满足条件的行来消除第一行的错误结果正确,这正是我所做的:)
df = pd.read_csv(io.StringIO("""Datetime    Valve1  Valve2
01/01/2020 11:00:01 1   0
01/01/2020 11:00:15 1   0
01/01/2020 11:30:00 1   0
01/01/2020 11:30:45 1   0
01/01/2020 12:00:10 1   1
01/01/2020 12:15:00 1   1
01/01/2020 12:15:30 1   1
01/01/2020 12:16:45 0   1
01/01/2020 13:17:00 1   0
01/01/2020 13:20:15 1   0
01/01/2020 13:21:30 1   0
01/01/2020 13:45:08 1   0
01/01/2020 14:00:00 0   1
01/01/2020 14:01:15 0   1
01/01/2020 14:30:00 0   1
"""), sep="\t")

df.Datetime = pd.to_datetime(df.Datetime)

dfr = df.groupby([df.Datetime.dt.date, df.Datetime.dt.hour]).apply(lambda dfa: ((dfa.Valve1==1) & (dfa.Valve1==1)).all())

df = (df.merge(dfr.to_frame(), left_on=[df.Datetime.dt.date, df.Datetime.dt.hour], right_index=True)
 .drop(columns=["key_0","key_1"])
 .rename(columns={0:"Cond"})
)