一夜之间处理日期时间

我有一个datetime.time()从不同日期获得的范围列表,按 排序init,我需要考虑重叠时间来获得输出。例如,


[{'init': datetime.time(10,0,0), 'end': datetime.time(12,0,0)},

 {'init': datetime.time(11,0,0), 'end': datetime.time(12,30,0)},

 {'init': datetime.time(22,0,0), 'end': datetime.time(4,30,0)},

 {'init': datetime.time(23,0,0), 'end': datetime.time(0,30,0)}]

输出应该是:


[{{'init': datetime.time(10,0,0), 'end': datetime.time(12,30,0)},

 {'init': datetime.time(22,0,0), 'end': datetime.time(4,30,0)}

为此,我遍历列表中的每个项目,根据是否满足条件更新 init 和 end 值(即该项目与前一个项目完全或部分重叠)。


x, y = range_list[0]['init'], range_list[0]['end']

for range in range_list:

    if range['init'] <= y:

        if range['end'] > y:

            y = range['end']

    else:

        print(x, y)

        x = range['init']

        y = range['end']

但是,按照此逻辑,我无法处理隔夜范围,因为例如,22:00:00不小于04:30:00.


当我控制输入数据时,我想返回带有完整datetime对象的列表,或者timestamp像


[{'init': datetime.time(2019,1,12,10,0,0), 'end': datetime.time(2019,1,12,12,0,0)},

 {'init': datetime.time(2019,1,13,11,0,0), 'end': datetime.time(2019,1,13,12,30,0)},

 {'init': datetime.time(2019,1,14,22,0,0), 'end': datetime.time(2019,1,15,4,30,0)},

 {'init': datetime.time(2019,1,16,23,0,0), 'end': datetime.time(2019,1,17,0,30,0)}]

但是,这将不起作用,因为由于日期的原因,每个项目都比前一个项目高。


那么,我该如何解决这个问题呢?


TL; 博士; 如果使用完整datetime或timestamp不是一个选项,如何在一夜之间处理时间范围?


慕尼黑8549860
浏览 197回答 3
3回答

万千封印

我改变了主意(和回答),现在认为您应该定义自己的数据结构来保存字典中的时间。有了它,您可以轻松地将结束时间调整为相对于初始时间的同一天。在下面的代码中, range_list 中的值与您的问题中显示的值相同,因此可以通过根据需要更改结束时间来进行调整。调整后,range_list包含:[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12, 0, 0)}&nbsp;{'init': Timestamp(11, 0, 0), 'end': Timestamp(12,30, 0)}&nbsp;{'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}&nbsp;{'init': Timestamp(23, 0, 0), 'end': Timestamp(24,30, 0)}]由于您控制输入数据,因此最好以所需的格式创建它们。from collections import namedtuplefrom pprint import pprint, pformatclass Timestamp(namedtuple('Timestamp', 'h,m,s')):&nbsp; &nbsp; def __repr__(self):&nbsp; &nbsp; &nbsp; &nbsp; classname = self.__class__.__name__&nbsp; &nbsp; &nbsp; &nbsp; return '{}({:2},{:2},{:2})'.format(classname, self.h, self.m, self.s)range_list = [{'init': Timestamp(10,0,0), 'end': Timestamp(12,0,0)},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {'init': Timestamp(11,0,0), 'end': Timestamp(12,30,0)},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {'init': Timestamp(22,0,0), 'end': Timestamp(4,30,0)},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {'init': Timestamp(23,0,0), 'end': Timestamp(0,30,0)}]# Adjust end times.for i, interval in enumerate(range_list):&nbsp; &nbsp; init, end = interval['init'], interval['end']&nbsp; &nbsp; range_list[i] = {'init': init,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'end' : Timestamp(end.h+24 if end.h < init.h else end.h,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end.m, end.s)}def merge(intervals):&nbsp; &nbsp; merged = []&nbsp; &nbsp; x, y = intervals[0]['init'], intervals[0]['end']&nbsp; &nbsp; for interval in intervals:&nbsp; &nbsp; &nbsp; &nbsp; if interval['init'] <= y:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if interval['end'] > y:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y = interval['end']&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; merged.append({'init': x, 'end': y})&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = interval['init']&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y = interval['end']&nbsp; &nbsp; merged.append({'init': x, 'end': y})&nbsp; &nbsp; return mergedprint(merge(range_list))输出:[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12,30, 0)},&nbsp;{'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python