【问题标题】:Overlap in date range grouped dataframe日期范围分组数据框中的重叠
【发布时间】:2021-09-22 11:43:31
【问题描述】:
我如何知道两行是否在其日期范围内重叠??
输入数据框:
| A |
B |
Start |
End |
Timestamp |
| A1 |
B1 |
2022-01-15 |
2022-02-15 |
2021-05-17 |
| A1 |
B1 |
2021-07-15 |
2021-10-17 |
2021-05-17 |
| A1 |
B1 |
2021-07-30 |
2021-10-02 |
2021-05-16 |
| A1 |
B2 |
2022-01-01 |
2023-01-01 |
2021-05-17 |
| A1 |
B2 |
2021-06-02 |
2021-06-04 |
2021-05-16 |
| A2 |
B3 |
2021-05-10 |
2021-05-12 |
2021-05-17 |
| A2 |
B3 |
2021-04-10 |
2021-06-12 |
2021-05-16 |
| A2 |
B4 |
2021-06-02 |
2021-06-04 |
2021-05-17 |
我想知道如何识别同一组(A 和 B)的两行之间是否存在重叠。例如,在第 0、1 和 2 行中,它们属于同一组(A1 和 B1),但第 1 行和第 2 行之间只有重叠,因为它们共享日期范围的一部分,因此我想要的是保留该行如果有重叠,则具有最高的时间戳。但是例如在第 3 行和第 4 行中,尽管它们属于同一组(A1 和 B2),因为它们的日期之间没有重叠,但我想保留两个日期。怎么可能?
预期的数据框:
| A |
B |
Start |
End |
Timestamp |
| A1 |
B1 |
2022-01-15 |
2022-02-15 |
2021-05-17 |
| A1 |
B1 |
2021-07-15 |
2021-10-17 |
2021-05-17 |
| A1 |
B2 |
2022-01-01 |
2023-01-01 |
2021-05-17 |
| A1 |
B2 |
2021-06-02 |
2021-06-04 |
2021-05-16 |
| A2 |
B3 |
2021-05-10 |
2021-05-12 |
2021-05-17 |
| A2 |
B4 |
2021-06-02 |
2021-06-04 |
2021-05-17 |
【问题讨论】:
标签:
python
pandas
dataframe
date
【解决方案1】:
你可以使用:
- 如果尚未在日期时间中,可选择将日期转换为日期时间
df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
- 对值进行排序以方便连续行之间的日期比较
df = df.sort_values(['A', 'B', 'Start', 'End'])
- 在相同的
A 和B 内设置组号以用于非重叠日期范围:通过比较排序行中的Start 日期大于前一行的End 日期(这将不重叠日期范围)。所有组号都相对于A 和B 的同一组内。
group = (df['Start'] > df.groupby(['A', 'B'])['End'].shift()).groupby([df['A'], df['B']]).cumsum()
- 按
A 和B 和重叠组号(按新创建的group)分组,并通过idxmax() 获得最高Timestamp 的索引。使用.loc 过滤这些行(在组中具有最高Timestamp)以保留。最后.sort_index()恢复原数据帧排序前的顺序。
df.loc[df.groupby([df['A'], df['B'], group])['Timestamp'].idxmax()].sort_index()
结果:
A B Start End Timestamp
0 A1 B1 2022-01-15 2022-02-15 2021-05-17
1 A1 B1 2021-07-15 2021-10-17 2021-05-17
3 A1 B2 2022-01-01 2023-01-01 2021-05-17
4 A1 B2 2021-06-02 2021-06-04 2021-05-16
5 A2 B3 2021-05-10 2021-05-12 2021-05-17
7 A2 B4 2021-06-02 2021-06-04 2021-05-17
【解决方案2】:
熊猫数组将为您提供帮助
它是这样的......数组(数据[,dtype,复制])......
有关更多信息,请阅读文档....我仍在为此寻找稳定的答案。
Panda docs