开发者社区 问答 正文

如何分配时间对象到箱子?

我有一个时间列表,我需要分配给时间窗口(7、9、12、15、18),以确保每个时间窗口都被我的列表中的一个元素覆盖。

from datetime import date, time, datetime

def nearest(items, target):
    return min(items, key=lambda x: abs(x - target))

time_list = [datetime.datetime(2019, 12, 17, 7, 30), 
             datetime.datetime(2019, 12, 17, 9, 0), 
             datetime.datetime(2019, 12, 17, 16, 0), 
             datetime.datetime(2019, 12, 17, 18, 30), 
             datetime.datetime(2019, 12, 17, 21, 30), 
             datetime.datetime(2019, 12, 17, 12, 30), 
             datetime.datetime(2019, 12, 17, 19, 0), 
             datetime.datetime(2019, 12, 17, 0, 0), 
             datetime.datetime(2019, 12, 17, 14, 30)]

target_times = [datetime.combine(date.today(),time(i,0)) for i in range(6,19,3)]
coverage = [abs(nearest(time_list, t)-t)<time(1,30) for t in target_times]

期望的输出:

[True, True, True, True, True]

这当前返回一个“<”错误,我可以绕过它,但我不确定这是否是完成我想做的事情的最佳方法。我有numpy和scipy库可用,可能还可以获得其他库。 问题来源StackOverflow 地址:/questions/59382506/how-to-assign-time-objects-to-bins

展开
收起
kun坤 2019-12-27 17:08:27 423 分享 版权
1 条回答
写回答
取消 提交回答
  • 这是我基于此提出的一个解决方案,所以问题是如何在python中检查当前时间是否在范围内?这是可行的,但我想知道是否有更好的解决方案。

    def time_in_range(start, end, x):
        today = timezone.localtime().date()
        start = timezone.make_aware(datetime.combine(today, start))
        end = timezone.make_aware(datetime.combine(today, end))
        x = timezone.make_aware(datetime.combine(today, x))
        if end <= start:
            end += timedelta(days=1) # tomorrow!
        if x <= start:
            x += timedelta(days=1) # tomorrow!
        return start <= x <= end
    
    downloaded = [False, False, False, False, False]
    times = [time(i,0) for i in [5,8,10,13,16,20]]
    for i in range(5):
        for start_time in start_times:
            if time_in_range(times[i], times[i+1], start_time):
                downloaded[i] = True
    
    2019-12-27 17:08:37
    赞同 展开评论
问答分类:
问答地址: