为了账号安全,请及时绑定邮箱和手机立即绑定

一夜之间处理日期时间

一夜之间处理日期时间

慕尼黑8549860 2021-10-12 15:43:55
我有一个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不是一个选项,如何在一夜之间处理时间范围?
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

我改变了主意(和回答),现在认为您应该定义自己的数据结构来保存字典中的时间。有了它,您可以轻松地将结束时间调整为相对于初始时间的同一天。


在下面的代码中, range_list 中的值与您的问题中显示的值相同,因此可以通过根据需要更改结束时间来进行调整。


调整后,range_list包含:


[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12, 0, 0)}

 {'init': Timestamp(11, 0, 0), 'end': Timestamp(12,30, 0)}

 {'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}

 {'init': Timestamp(23, 0, 0), 'end': Timestamp(24,30, 0)}]

由于您控制输入数据,因此最好以所需的格式创建它们。


from collections import namedtuple

from pprint import pprint, pformat



class Timestamp(namedtuple('Timestamp', 'h,m,s')):

    def __repr__(self):

        classname = self.__class__.__name__

        return '{}({:2},{:2},{:2})'.format(classname, self.h, self.m, self.s)



range_list = [{'init': Timestamp(10,0,0), 'end': Timestamp(12,0,0)},

              {'init': Timestamp(11,0,0), 'end': Timestamp(12,30,0)},

              {'init': Timestamp(22,0,0), 'end': Timestamp(4,30,0)},

              {'init': Timestamp(23,0,0), 'end': Timestamp(0,30,0)}]


# Adjust end times.

for i, interval in enumerate(range_list):

    init, end = interval['init'], interval['end']

    range_list[i] = {'init': init,

                     'end' : Timestamp(end.h+24 if end.h < init.h else end.h,

                             end.m, end.s)}


def merge(intervals):

    merged = []

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

    for interval in intervals:

        if interval['init'] <= y:

            if interval['end'] > y:

                y = interval['end']

        else:

            merged.append({'init': x, 'end': y})

            x = interval['init']

            y = interval['end']

    merged.append({'init': x, 'end': y})

    return merged



print(merge(range_list))

输出:


[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12,30, 0)},

 {'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}]


查看完整回答
反对 回复 2021-10-12
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信