如果满足条件,则移动到嵌套for循环的下一次迭代



我在for循环中比较了两个数据帧:df_intervalsdf_events。对于每个事件,循环检查事件的时间戳是否在所有可能的时间间隔之间。我打算让循环做的是,对于每个事件,检查每个间隔,如果为True,则附加到列表中并继续下一个,如果全部为False,则将False附加到列表中。

df_events, df_intervals
(  Var2                  ts
0  bar 2021-02-10 09:04:31
1  bar 2021-01-29 05:56:17
2  bar 2021-01-16 15:59:43
3  bar 2021-01-25 09:40:40
4  bar 2021-01-27 16:44:57
5  bar 2021-01-17 13:28:43
6  bar 2021-02-03 11:46:10
7  bar 2021-02-02 11:16:49
8  bar 2021-01-21 17:12:15
9  bar 2021-01-19 03:44:30,
Var1            start_ts              end_ts
0  foo 2021-02-01 20:29:57 2021-02-02 20:29:57
1  foo 2021-02-03 20:29:57 2021-02-04 20:29:57
2  foo 2021-02-04 20:29:57 2021-02-05 20:29:57
3  foo 2021-02-05 20:29:57 2021-02-06 20:29:57
4  foo 2021-02-06 20:29:57 2021-02-07 20:29:57
5  foo 2021-02-07 20:29:57 2021-02-08 20:29:57
6  foo 2021-02-08 20:29:57 2021-02-11 20:29:57
7  foo 2021-02-08 20:29:57 2021-02-10 20:29:57
8  foo 2021-02-10 20:29:57 2021-02-11 20:29:57)

我不确定我在这里做错了什么,因为我在每个事件开始时设置match=False,如果条件不满足,将其附加到循环结束时的列表中。

matches = []
for event in df_events['ts']:
for idx, a,b,c in df_intervals.itertuples():
match=False
if b <= event <= c:
match=True
matches.append(match)
break
else:
continue
matches.append(match)
​

matches
matches
[True, True]

期望的输出是:

[True, False, False, False, False, False, False, True, False, False]

也许您应该研究一下列表理解和anyall函数。如果你看一下内部循环的体,你有if/else条件,它要么是breaks,要么是continues。所以最后一行是不可访问的

def find_matches(events, intervals):
for event in events['ts']:
if any(start <= event and event <= end
for _, _, start, end in intervals.itertuples()):
yield True
else:
yield False
matches = list(find_matches(df_event, df_intervals))

加上coreyp_1的答案,您的匹配将在每个间隔开始时设置为False,而不是您想要的每个事件。

最后一次

matches.append(match)

可能缩进太深了。现在,由于前面的if..else块的breakcontinue,这一行永远不会执行。

相关内容

  • 没有找到相关文章

最新更新