如何解决确定日期范围内不包括重叠的空白天数
我正在处理一个以 parent_id、id、start_date 和 end_date 作为列的数据集。
我想检查在一个日历年中,parent_id 没有运行 id 的天数。问题在于“重叠”。我想排除重叠的日子。我该如何解决这个问题?
样本输入:
parent_id id start_date end_date
ABCD 1 2019-10-26 2020-06-30
ABCD 2 2020-01-02 2020-04-01
ABCD 3 2020-07-09 2020-12-31
ABCD 4 2020-07-14 2020-09-26
EFGH 22 2020-01-02 2020-03-31
EFGH 23 2020-01-02 2020-04-01
EFGH 24 2020-01-15 2020-04-07
样本输出:
parent_id Year (2020)
ABCD 8
EFGH 268
因此,在 2020 年,parent_id ABCD 有 8 天处于非活动状态。 (7 月 1 日至 7 月 8 日)。
我确实在门户网站上参考了类似的问题,但没有一个对我的问题有效。
Efficient date range overlap calculation in python?
How to find range overlap in python?
Find date range overlap in python
解决方法
这可能会满足您的需求:
def count_inactive_days(data):
all_days = pd.date_range(pd.Timestamp(data["start_date"].min().year,1,1),pd.Timestamp.today(),freq="D")
active_days = pd.DatetimeIndex(sorted(set(date for sublist in data.apply(lambda x: pd.date_range(x["start_date"],x["end_date"],freq="D"),axis=1).to_list() for date in sublist)))
inactive_days = all_days.to_series().resample("Y").count() - active_days.to_series().resample("Y").count()
inactive_days.index = inactive_days.index.year
return inactive_days
>>> pd.concat([df.groupby("parent_id").apply(count_inactive_days)]).unstack()
2019 2020
parent_id
ABCD 298.0 8.0
EFGH NaN 269.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。