Python 如何将时间对象分配到存储箱?

Python 如何将时间对象分配到存储箱?,python,date,datetime,time,comparison-operators,Python,Date,Datetime,Time,Comparison Operators,我有一个需要分配给时间窗口(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), datet

我有一个需要分配给时间窗口(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]

这当前返回一个“这是我根据这个SO问题组合起来的一个解决方案。它是有效的,但我想知道是否有更好的解决方案

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
def time_在_范围内(开始、结束、x):
今天=时区.localtime().date()
开始=时区。注意(datetime.combine(今天开始))
end=时区。使_知晓(datetime.combine(今天,结束))
x=时区。使_知晓(datetime.combine(今天,x))

如果end这是我根据这个SO问题提出的一个解决方案。它是有效的,但我想知道是否有更好的解决方案

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
def time_在_范围内(开始、结束、x):
今天=时区.localtime().date()
开始=时区。注意(datetime.combine(今天开始))
end=时区。使_知晓(datetime.combine(今天,结束))
x=时区。使_知晓(datetime.combine(今天,x))

如果end,您当前问题的答案是您正在尝试将
timedelta
ob对象与
time
对象进行比较。在这种情况下,您可能希望创建一个
timedelta
对象,如下所示:

timedelta(hours=1, minutes=30)
而不是

time(1,30)

直接问题的答案是,您正在尝试将
timedelta
ob对象与
time
对象进行比较。在这种情况下,您可能希望创建一个
timedelta
对象,如下所示:

timedelta(hours=1, minutes=30)
而不是

time(1,30)
您可能希望在这里使用;因为它具有处理垃圾箱和间隔的内置方法

在这种情况下,您有四(4)个时间间隔:

  • [7至9)
  • [9至12)
  • [12至15)
  • [15至18)
  • …还有18到24分钟的间隔时间吗
  • “[”指包容性,而“)”指排他性

    您可以将时间列表加载到数据帧中:

    import pandas as pd
    
    df = pd.DataFrame(time_list,columns=['timestamp']) # `columns` is how you name the column(s)
    
    那么,我建议pandas的原因是它有一个有用的函数,叫做whichbins value

    >>> bins = [7, 9, 12, 15, 18]
    >>> pd.cut(df['timestamp'].dt.hour,bins=bins).unique().dropna().sort_values()
    [(7, 9], (9, 12], (12, 15], (15, 18]]
    
    然后,您可以像这样测试上述操作结果的适当长度(减去1是因为有五个箱子:

    >>> covered_intervals = _ # an underscore gets the most recent value in the interpreter
    >>> len(covered_intervals) == len(bins) - 1
    True
    
    如果你想要一个布尔值列表,你可以:

    result = []
    for i in covered_intervals:
        if i.left in bins:
            result.append(True)
        else:
            result.append(False)
    
    您可能希望在这里使用;因为它具有处理垃圾箱和间隔的内置方法

    在这种情况下,您有四(4)个时间间隔:

  • [7至9)
  • [9至12)
  • [12至15)
  • [15至18)
  • …还有18到24分钟的间隔时间吗
  • “[”指包容性,而“)”指排他性

    您可以将时间列表加载到数据帧中:

    import pandas as pd
    
    df = pd.DataFrame(time_list,columns=['timestamp']) # `columns` is how you name the column(s)
    
    那么,我建议pandas的原因是它有一个有用的函数,叫做whichbins value

    >>> bins = [7, 9, 12, 15, 18]
    >>> pd.cut(df['timestamp'].dt.hour,bins=bins).unique().dropna().sort_values()
    [(7, 9], (9, 12], (12, 15], (15, 18]]
    
    然后,您可以像这样测试上述操作结果的适当长度(减去1是因为有五个箱子:

    >>> covered_intervals = _ # an underscore gets the most recent value in the interpreter
    >>> len(covered_intervals) == len(bins) - 1
    True
    
    如果你想要一个布尔值列表,你可以:

    result = []
    for i in covered_intervals:
        if i.left in bins:
            result.append(True)
        else:
            result.append(False)
    

    您所需的输出在列表中有5个条目,与目标时间匹配…因此您是否正在查看
    时间列表
    的任何元素是否位于
    目标时间
    的任何箱子中?我想知道
    目标时间
    是否都包含在
    时间列表
    元素中您所需的输出在li中有5个条目st,它与目标时间匹配…那么您是否正在查看
    时间列表
    的任何元素是否位于
    目标时间
    的任何箱子中?我想知道
    目标时间
    是否都包含在
    时间列表
    元素中