gpt4 book ai didi

python - 在日期范围分组数据框中重叠

转载 作者:行者123 更新时间:2023-12-04 14:54:29 25 4
gpt4 key购买 nike

我如何知道两行的日期范围是否重叠?

输入数据框:

<表类="s-表"><头>AB开始结束时间戳<正文>A1B12022-01-152022-02-152021-05-17A1B12021-07-152021-10-172021-05-17A1B12021-07-302021-10-022021-05-16A1B22022-01-012023-01-012021-05-17A1B22021-06-022021-06-042021-05-16A2B32021-05-102021-05-122021-05-17A2B32021-04-102021-06-122021-05-16A2B42021-06-022021-06-042021-05-17

我想知道如何确定同一组(A 和 B)的两行之间是否存在重叠。例如,在第 0、1 和 2 行中,它们属于同一组(A1 和 B1),但是第 1 行和第 2 行之间只有重叠,因为它们共享日期范围的一部分,因此我想要的是保留该行如果有重叠,则具有最高的时间戳。但是例如在第 3 行和第 4 行中,尽管它们属于同一组(A1 和 B2),因为它们的日期之间没有重叠,但我想保留两个日期。怎么做到的?

预期数据框:

<表类="s-表"><头>AB开始结束时间戳<正文>A1B12022-01-152022-02-152021-05-17A1B12021-07-152021-10-172021-05-17A1B22022-01-012023-01-012021-05-17A1B22021-06-022021-06-042021-05-16A2B32021-05-102021-05-122021-05-17A2B42021-06-022021-06-042021-05-17

最佳答案

您可以使用:

  1. 如果日期不在日期时间中,可选择将日期转换为日期时间
df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
  1. 对值进行排序以方便连续行之间的日期比较
df = df.sort_values(['A', 'B', 'Start', 'End'])
  1. 在相同的 AB 中为非重叠日期范围设置组号:通过比较排序行中的 Start 日期较大比上一行的 End 日期(这将是不重叠的日期范围)。所有组号都是相对于 AB 的同一组。
group = (df['Start'] >  df.groupby(['A', 'B'])['End'].shift()).groupby([df['A'], df['B']]).cumsum()
  1. AB 和重叠组编号(按新创建的 group)分组,并获取最高 Timestamp< 的索引 通过 idxmax()。使用 .loc 过滤此类行(组中具有最高的 Timestamp)以保留。最后 .sort_index() 恢复排序前原始 dataframe 的序列。
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

关于python - 在日期范围分组数据框中重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68362079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com