Python 当时段相互重叠时,如何使用开始日期和结束日期计算一组日长?

Python 当时段相互重叠时,如何使用开始日期和结束日期计算一组日长?,python,date,Python,Date,比如说, 01/01/2015 - 02/01/2015 03/31/2015 - 09/01/2016 05/31/2016 - 07/01/2016 06/01/2016 - 04/15/2017 如何使用Python 2计算所有期间的总长度而不重叠?使用问题和答案,我们可以合并重叠的日期。然后我们只需要把这些间隔的差异加起来。我将让您验证此代码是否满足您的要求 from __future__ import print_function import datetime as dt def

比如说,

01/01/2015 - 02/01/2015 03/31/2015 - 09/01/2016 05/31/2016 - 07/01/2016 06/01/2016 - 04/15/2017
如何使用Python 2计算所有期间的总长度而不重叠?

使用问题和答案,我们可以合并重叠的日期。然后我们只需要把这些间隔的差异加起来。我将让您验证此代码是否满足您的要求

from __future__ import print_function

import datetime as dt

def merge_intervals(intervals):
    """
    A simple algorithm can be used:
    1. Sort the intervals in increasing order
    2. Push the first interval on the stack
    3. Iterate through intervals and for each one compare current interval
       with the top of the stack and:
       A. If current interval does not overlap, push on to stack
       B. If current interval does overlap, merge both intervals in to one
          and push on to stack
    4. At the end return stack
    """
    sorted_by_lower_bound = sorted(intervals, key=lambda tup: tup[0])
    merged = []

    for higher in sorted_by_lower_bound:
        if not merged:
            merged.append(higher)
        else:
            lower = merged[-1]
            # test for intersection between lower and higher:
            # we know via sorting that lower[0] <= higher[0]
            if higher[0] <= lower[1]:
                upper_bound = max(lower[1], higher[1])
                merged[-1] = (lower[0], upper_bound)  # replace by merged interval
            else:
                merged.append(higher)
    return merged

if __name__ == '__main__':
    l = [(dt.date(2015,1,1),dt.date(2015,2,1)), 
         (dt.date(2015,3,31),dt.date(2015,9,1)), 
         (dt.date(2016,5,31),dt.date(2016,7,1)),  
         (dt.date(2016,6,1),dt.date(2017,4,15))]
    print("Original list of ranges: {}".format(l))
    merged_list = merge_intervals(l)
    print("List of ranges after merge_ranges: {}".format(merged_list))

    total_length = 0
    for i,j in merged_list:
        total_length += abs(j - i).days

    print('total length in days: {}'.format(total_length))

看起来你想让我们为你写些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。展示这一成果的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出以及您实际获得的控制台输出、回溯等。。你提供的细节越多,你可能得到的答案就越多。检查一下,然后。@Rory,如果看起来我什么都不想做,我很抱歉。我发布这个问题主要是因为任务的复杂性高于我的水平。我只是希望有人已经有了这方面的经验,并至少能给我一些关于执行步骤的见解。它工作得非常完美。谢谢干杯欢迎使用堆栈溢出:-