【发布时间】:2021-10-13 22:45:26
【问题描述】:
我需要知道根据每个 student_id 在不同日期范围内重叠了多少天。
到目前为止我的解决方案是:
# example data frame
start_dates = pd.date_range('2021-02-24', periods=4, freq='D')
end_dates = pd.date_range('2021-02-24', periods=4, freq='M')
data = {'id':['123456', '123456', '789101', '903456'],
'starts_on':start_dates,
'ends_on':end_dates}
df = pd.DataFrame(data)
Output:
id starts_on ends_on
0 123456 2021-02-24 2021-02-28
1 123456 2021-02-25 2021-03-31
2 789101 2021-02-26 2021-04-30
3 903456 2021-02-27 2021-05-31
如您所见,第一行和第二行具有相同的 id 并且日期是重叠的(第二个日期比另一个日期晚一天开始并更晚结束,因此它有 4 天的重叠)。我需要一种方法来为更大的数据框执行此过程。
到目前为止,我最好的解决方案是一种计算两天之间重叠天数的方法,但我不知道如何在我的数据帧行上迭代它,因为考虑到 id 必须相同,然后比较日期查看每个 id 的重叠天数:
Range = namedtuple('Range', ['start', 'end'])
r1 = Range(start=datetime(2021, 2, 24), end=datetime(2021, 2, 28))
r2 = Range(start=datetime(2021, 2, 25), end=datetime(2021, 3, 31))
latest_start = max(r1.start, r2.start)
earliest_end = min(r1.end, r2.end)
delta = (earliest_end - latest_start).days + 1
overlap = max(0, delta)
overlap
Output:
4
【问题讨论】:
-
你可以使用 groupby
df.groupby('id').apply(lambda x: (x['ends_on']- x['starts_on'].shift(-1)).dt.days+1).max() -
嗨@Nagakiran,非常感谢您的帮助!还有一个问题,如何在我的数据框中使用这个 groupby 的结果创建一个新列?
-
您可以简单地转换数据,并将结果分配给新列,我只是添加到答案
标签: python pandas dataframe date