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

时间:2021-03-05 08:04:44

标签: python pandas 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 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

还有我的情况: (Valve1=1 for 1h) 和 (Valve-0 for 1h) 我想到使用滚动总和如下:

data = data.set_index('Datetime', drop=True)
data.loc[((data.Valve1.rolling('1h').sum())==?) & ((data.Valve2.rolling('1h').sum())==0), 'alarm'] = 'Yes' 

最终数据帧不应重新采样或包含任何内插/填充值。 [注意]:任何缺失的日期时间都会得到与之前可用的日期时间相同的 Valve1 和 Valve2

最终结果如下:

<头>
日期时间 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 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

2 个答案:

答案 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

现在应该可以了。

答案 1 :(得分:0)

  • 使用 groupby() date()hour
  • 使用逻辑给出bool结果
  • merge() 返回您的数据框
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"})
)

<头>
日期时间 Valve1 Valve2 条件
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