从Python Dict返回多个具有日期时间范围的值

时间:2018-09-25 07:47:03

标签: python python-2.7 datetime dictionary

使用DateTime作为dict键遇到问题。我的目标是从一个包含Datetime的数据源中引入信息,然后在字典中查找并返回输入DateTime的2天之内的所有键值。

例如,我的输入将是: datetime.datetime(2018, 9, 20, 12, 48)

我的参考字典是: example = {datetime.datetime(2018, 9, 20, 14, 43):'A', datetime.datetime(2018, 9, 18, 19, 41):'B', datetime.datetime(2018, 9, 15, 9, 12):'C'}

在这种情况下,我将返回:A, B

我考虑过对字典进行排序,然后为可能为奇数日期的索引创建字典,然后输入我的输入日期,计算输入日期的基准日期+-2,引用索引字典,然后使用这些索引仅在索引之间循环遍历引用字典,并返回其中的所有值。

我的主要问题是我无法预测dict的日期时间或输入的日期时间,所以我不确定是否可以通过字典中的索引来返回字典中某个键范围的值键的顺序。由于要浏览的键数众多,因此对所有键进行for循环效率不高-我已经通过尽可能多地重复数据删除并仅引入最少数量的参考数据来减少此列表。

另外一项是我要输入的日期时间为100,000s,其中许多时间彼此相差数分钟,数秒或数小时,因此减少查询次数和循环对于保持日期至关重要运行时中断。

我很抱歉,如果这不是一个完整的代码来考虑的问题,但我基本上不知道从哪里开始这个问题,所以我认为这不会帮助任何人,除了示例输入和具有输出目标的字典。

1 个答案:

答案 0 :(得分:1)

  • 首先,对字典日期进行排序,然后将字典转换为已排序元组的列表:

    {{$angebot[1]->stellenname}}
    
  • 然后使用等分线在列表中查找日期的位置:

    dic_dates = {
        datetime.datetime(2018, 9, 20, 14, 43):'A',
        datetime.datetime(2018, 9, 18, 12, 41):'B',
        datetime.datetime(2018, 9, 15, 9, 12):'C'
    }
    
    sorted_dates = sorted(dic_dates.items())
    
  • 从该位置向左看,并在元素不验证条件时立即中断,然后从右侧位置开始执行相同操作。 (您可以使用您自己的条件,因为我发现您的示例中还不清楚-+ -2天不应该选择“ B” IMO,但这不是重点)

    dat = datetime.datetime(2018, 9, 20, 12, 48)
    insert_index = bisect.bisect_left(sorted_dates, (dat,None))
    

编辑

bisct_left实现的一个示例:

if insert_index:
#if insert_index = 0, do not loop on left side
    dat_min = dat - datetime.timedelta(days=2)
    for d in sorted_dates[insert_index-1::-1]:
        if d[0] > dat_min:
            print(d[1])
        else:
            break

dat_max = dat + datetime.timedelta(days=2)
for d in sorted_dates[insert_index:]:
    if d[0] < dat_max:
        print(d[1])
    else:
        break

我强烈建议您使用bisect,因为它将更快,更可靠。