Python嵌套列表-时间间隔-相交和差异

Python嵌套列表-时间间隔-相交和差异,python,datetime,intervals,Python,Datetime,Intervals,我有一个嵌套列表的问题,时间作为元素 time=[(2017-01-01T00:00:00.000000Z,2017-01-01T00:00:39.820000Z), (2017-01-01T00:00:38.840000Z,2017-01-01T01:36:33.260000Z), (2017-01-01T01:36:45.960000Z,2017-01-01T03:06:15.340000Z), (2017-01-01T03:06:24.320000Z,2017-01-01T03:31:00

我有一个嵌套列表的问题,时间作为元素

time=[(2017-01-01T00:00:00.000000Z,2017-01-01T00:00:39.820000Z),
(2017-01-01T00:00:38.840000Z,2017-01-01T01:36:33.260000Z),
(2017-01-01T01:36:45.960000Z,2017-01-01T03:06:15.340000Z),
(2017-01-01T03:06:24.320000Z,2017-01-01T03:31:00.420000Z),
(2017-01-01T03:31:22.880000Z,2017-01-01T03:48:43.500000Z),
(2017-01-01T03:48:53.280000Z,2017-01-01T04:14:53.660000Z),
(2017-01-01T04:15:15.160000Z,2017-01-01T04:34:44.060000Z),
(2017-01-01T04:34:57.440000Z,2017-01-01T04:46:31.100000Z),
(2017-01-01T04:46:53.320000Z,2017-01-01T05:22:20.340000Z),
(2017-01-01T05:22:24.920000Z,2017-01-01T06:17:30.900000Z),
(2017-01-01T06:18:02.280000Z,2017-01-01T07:01:45.740000Z),
(2017-01-01T07:02:04.640000Z,2017-01-01T07:39:48.780000Z),
(2017-01-01T07:40:12.400000Z,2017-01-01T08:19:46.140000Z),
(2017-01-01T08:20:13.520000Z,2017-01-01T10:17:45.380000Z),
(2017-01-01T10:17:59.880000Z,2017-01-01T15:01:29.100000Z),
(2017-01-01T15:01:55.840000Z,2017-01-01T15:08:45.460000Z),
(2017-01-01T15:09:04.000000Z,2017-01-01T15:42:13.180000Z),
(2017-01-01T15:42:30.360000Z,2017-01-01T16:14:07.340000Z),
(2017-01-01T16:14:24.560000Z,2017-01-01T17:11:28.420000Z),
(2017-01-01T17:11:32.960000Z,2017-01-01T17:46:07.660000Z),
(2017-01-01T17:46:30.280000Z,2017-01-01T18:02:17.860000Z),
(2017-01-01T18:02:35.240000Z,2017-01-01T18:16:17.740000Z),
(2017-01-01T18:16:26.720000Z,2017-01-01T18:39:10.540000Z),
(2017-01-01T18:39:19.360000Z,2017-01-01T19:45:25.860000Z),
(2017-01-01T19:45:34.720000Z,2017-01-01T20:41:00.220000Z),
(2017-01-01T20:41:21.520000Z,2017-01-01T21:13:51.660000Z),
(2017-01-01T21:14:13.360000Z,2017-01-01T21:41:16.220000Z),
(2017-01-01T21:41:28.640000Z,2017-01-01T22:03:03.820000Z),
(2017-01-01T22:03:29.400000Z,2017-01-01T23:14:13.500000Z),
(2017-01-01T23:14:35.200000Z,2017-01-01T23:59:59.980000Z)]
如您所见,所有元素都属于同一天,2017-01-01,我想做的是全天(86400秒)和列表中所有间隔的差异(以秒或毫秒为单位),但有一些重叠,因此我认为首先我必须进行某种“交叉点检查”,在设置完所有交叉点之后,只需计算所有元素与86400之间的差异,但如何进行交叉点检查?。如有任何建议,将不胜感激,提前感谢

期望输出:
86400(天)-85000(列表时间交叉后的可能时间,以秒为单位)=1400

将字符串转换为数字后,您可以使用中的顶部答案将字符串转换为数字后,您可以使用中的顶部答案进行排序,然后合并任何重叠

time.sort()
noOverlapList = []
start = time[0][0] # start of first interval
end = time[0][1] # end of first interval
for interval in time:
    # if interval overlaps with tempInterval
    if interval[0] < end and interval[1] > end:
            end = interval[1]
    else if interval[0] > end:
        noOverlapList.append((start, end)) # merged non overlapping interval
        start = interval[0]
        end = interval[1]
time.sort()
noOverlapList=[]
开始=时间[0][0]#第一个间隔的开始
结束=时间[0][1]#第一个间隔结束
对于时间间隔:
#如果间隔与tempInterval重叠
如果间隔[0]end:
结束=间隔[1]
否则,如果间隔[0]>结束:
noOverlapList.append((开始,结束))#合并的非重叠间隔
开始=间隔[0]
结束=间隔[1]

然后将
noOverlaplList
中包含的时间间隔相加,得到差值

您可以排序,然后合并任何重叠

time.sort()
noOverlapList = []
start = time[0][0] # start of first interval
end = time[0][1] # end of first interval
for interval in time:
    # if interval overlaps with tempInterval
    if interval[0] < end and interval[1] > end:
            end = interval[1]
    else if interval[0] > end:
        noOverlapList.append((start, end)) # merged non overlapping interval
        start = interval[0]
        end = interval[1]
time.sort()
noOverlapList=[]
开始=时间[0][0]#第一个间隔的开始
结束=时间[0][1]#第一个间隔结束
对于时间间隔:
#如果间隔与tempInterval重叠
如果间隔[0]end:
结束=间隔[1]
否则,如果间隔[0]>结束:
noOverlapList.append((开始,结束))#合并的非重叠间隔
开始=间隔[0]
结束=间隔[1]

然后,只需将
Nooverlaplist
中包含的时间间隔求和,然后得到差值

问题有两个:

  • 用它们的结合代替重叠的间隔
  • 将得到的非重叠间隔相加
第一部分可以这样做:

time.sort()
new_time = [list(time[0])]
for t in time[1:]:
    if t[0] <= new_time[-1][1]:
        if t[1] > new_time[-1][1]:
            new_time[-1][1] = t[1]
    else:
        new_time.append(list(t))

问题有两方面:

  • 用它们的结合代替重叠的间隔
  • 将得到的非重叠间隔相加
第一部分可以这样做:

time.sort()
new_time = [list(time[0])]
for t in time[1:]:
    if t[0] <= new_time[-1][1]:
        if t[1] > new_time[-1][1]:
            new_time[-1][1] = t[1]
    else:
        new_time.append(list(t))

请编辑您的帖子以包含所需的输出请编辑您的帖子以包含所需的输出此处不需要lambda-元组按字典顺序排序。另一个问题是,如果一个间隔完全位于另一个间隔内,则会发生什么情况,因此
interval[0]
为真,而
interval[1]>end
为假?我认为我的解决方案涵盖了这种情况。是的,忘记了else if。这里不需要lambda-元组按字典顺序排序。另一个问题是,如果一个区间完全在另一个区间内,那么会发生什么情况,因此
interval[0]
是真的,但是
interval[1]>end
不是真的?我认为我的解决方案涵盖了这种情况。是的,忘记了else if.很好地工作,尝试用更大的重叠来更改一些值,效果非常好,谢谢!很好地工作,尝试改变一些更大的重叠值,它的工作真的很好,谢谢!