【发布时间】:2021-12-23 09:30:23
【问题描述】:
我无法计算每行的开始和结束是连续的记录 ID 总数。连续意味着当一行在前一行结束之前开始并且 Name == Name 时。记录 ID 1-3 是连续的,因为它们重叠并且具有连续的开始/结束日期时间。
我只想在连续冲突总数 > = 3 的情况下显示 TRUE,否则为 FALSE。
import pandas as pd
import io
#SAMPLE DATA 1 DF
df = pd.read_csv(io.StringIO("""
Record ID;Record Name;Record Start;Record End
1;SMITH, JOHN;10/20/20 8:00 AM;10/20/20 9:30 AM
2;SMITH, JOHN;10/20/20 9:20 AM;10/20/20 10:30 AM
3;SMITH, JOHN;10/20/20 10:20 AM;10/20/20 11:00 AM
4;SMITH, JOHN ;10/20/20 1:00 AM;10/20/20 2:15 PM
5;SMITH, JOHN;10/20/20 2:00 PM;10/20/20 4:00 PM
"""),sep=';')
# SAMPLE DATA 2 DF
df = pd.read_csv(io.StringIO("""
Record ID;Record Name;Record Start;Record End
1;SMITH, JOHN;10/4/20 8:00 AM;10/20/20 9:30 AM
2;SMITH, JOHN;10/4/20 9:20 AM;10/20/20 10:30 AM
3;SMITH, JOHN;10/4/20 11:20 AM;10/20/20 12:00 PM
4;SMITH, JOHN ;10/4/20 1:00 PM;10/20/20 2:15 PM
5;SMITH, JOHN;10/4/20 3:15 PM;10/20/20 4:00 PM
"""),sep=';')
df['Start'] = df['Record Start']
df['End'] = df['Record End']
df['Start'] = pd.to_datetime(df['Start'], errors='coerce')
df['End'] = pd.to_datetime(df['End'], errors='coerce')
df['overlap?'] = False
print(df)
Expected Output for Sample Data 1:
Record ID Record Name ... overlap? total records consec >=3?
0 1 SMITH, JOHN ... True True
1 2 SMITH, JOHN ... True True
2 3 SMITH, JOHN ... True True
3 4 SMITH, JOHN ... True False
4 5 SMITH, JOHN ... True False
Expected Output for Sample Data 2:
Record ID Record Name ... overlap? total records consec >=3?
0 1 SMITH, JOHN ... True False
1 2 SMITH, JOHN ... True False
2 3 SMITH, JOHN ... True False
3 4 SMITH, JOHN ... False False
4 5 SMITH, JOHN ... True False
这会产生误报。它只是按名称和日期分组并计算重叠次数。但不考虑这些重叠是否连续。
更新: 从建议的答案中,如果计数是连续的,我将以下代码添加到它的末尾以获取真值或假值。 (对于任何有兴趣的人)。不幸的是,解决方案(对应部分)不起作用的示例数据 3。
prev= -1
consecutive = []
for i, v in enumerate(df['Count'].values):
if v <= prev:
if prev >= 3:
consecutive += prev * [True]
else:
consecutive += prev * [False]
elif len(df) == i + 1:
if prev >= 3:
consecutive += v * [True]
else:
consecutive += v * [False]
prev = v
df[['Consecutive']] = consecutive
# SAMPLE DATA 3 DF
df = pd.read_csv(io.StringIO("""
Record ID;Record Name;Record Start;Record End
1;SMITH, JOHN;10/5/20 7:47 AM;10/5/20 8:05 AM
2;SMITH, JOHN;10/5/20 11:43 AM;10/5/20 1:26 AM
3;SMITH, JOHN;10/5/20 12:48 AM;10/5/20 1:31 PM
4;SMITH, JOHN ;10/5/20 2:50 PM;10/5/20 5:00 PM
"""),sep=';')
Current Output:
Event ID Name Event Date ... End2 overlap Count
0 1 SMITH, JOHN 2021-10-05 ... 2021-10-05 08:05:00 False 1
1 2 SMITH, JOHN 2021-10-05 ... 2021-10-05 13:26:00 True 2
2 3 SMITH, JOHN 2021-10-05 ... 2021-10-05 13:31:00 True 3
3 4 SMITH, JOHN 2021-10-05 ... 2021-10-05 17:53:00 False 4
Expected Output:
Event ID Name Event Date ... End2 overlap Count
0 1 SMITH, JOHN 2021-10-05 ... 2021-10-05 08:05:00 False 1
1 2 SMITH, JOHN 2021-10-05 ... 2021-10-05 13:26:00 True 1
2 3 SMITH, JOHN 2021-10-05 ... 2021-10-05 13:31:00 True 2
3 4 SMITH, JOHN 2021-10-05 ... 2021-10-05 17:53:00 False 1
预期输出的推理:
- 事件 1 不与任何其他事件发生冲突。计数 =1(从 1 开始)并且重叠 = False
- 事件 2 和 3 相互重叠。事件 ID 2 的计数设置回 1,事件 ID 3 的计数设置回 2。重叠 = 两者都为真。
- 事件 4 不与任何其他事件重叠。计数设置回 1。重叠 = 假
样本数据 4
df = pd.read_csv(io.StringIO("""
Record ID;Record Name;Record Start;Record End
1;SMITH, JOHN;10/4/20 12:00 AM;10/4/20 7:00 PM
2;SMITH, JOHN;10/4/20 8:00 AM;10/4/20 9:00 AM
3;SMITH, JOHN;10/4/20 10:00 AM AM;10/4/20 11:00 AM
4;SMITH, JOHN ;10/4/20 4:30 PM;10/4/20 5:00 PM
"""),sep=';')
Current Output:
Record Start Record End overlap Count
0 2021-10-04 02:00:00 2021-10-04 19:53:00 True 1
1 2021-10-04 08:05:00 2021-10-04 08:47:00 True 2
2 2021-10-04 09:55:00 2021-10-04 10:36:00 True 1
3 2021-10-04 13:19:00 2021-10-04 14:15:00 True 1
4 2021-10-04 16:39:00 2021-10-04 17:07:00 True 1
Expected Output:
Record Start Record End overlap Count
0 2021-10-04 02:00:00 2021-10-04 19:53:00 True 1
1 2021-10-04 08:05:00 2021-10-04 08:47:00 True 2
2 2021-10-04 09:55:00 2021-10-04 10:36:00 True 3
3 2021-10-04 13:19:00 2021-10-04 14:15:00 True 4
4 2021-10-04 16:39:00 2021-10-04 17:07:00 True 5
【问题讨论】:
标签: python pandas loops python-datetime