gpt4 book ai didi

python - 将日期时间列表与日期时间字典进行比较

转载 作者:太空狗 更新时间:2023-10-29 17:19:38 24 4
gpt4 key购买 nike

我有一个任务是根据特定条件创建日期集,例如“大于 2”将被传递,我需要创建这个月中有一天 > 2 的所有日期集。我也会获取开始时间和停止时间,例如上午 10 点到下午 6 点,在这种情况下,我将创建一组所有 > 2 的日期,并且每天都有时间从上午 10 点开始,结束时间和下午 6 点,下面是一个示例:

greater > 2 less < 9 
start time :10am
stop time :6 pm
month:july
date1: 2016-07-03 10:00, 2016-07-03 16:00
date2: 2016-07-04 10:00, 2016-07-04 16:00
date3: 2016-07-05 10:00, 2016-07-05 16:00
.
.
.
date6: 2016-07-8 10:00, 2016-07-8 16:00

我决定将这些日期存储到如下字典中:

dictD = {'dates_between_2_9':[[2016-07-03 10:00, 2016-07-03 16:00], [2016-07-04 10:00, 2016-07-04 16:00], ....., [2016-07-08 10:00, 2016-07-08 16:00]]} 

我使用字典是因为我将有多个条件需要为它们创建日期集,因此除了 dates_between_2_5 之外还有另一个键。

另一方面,我也收到另一个基于条件的请求,以创建仅包含开始时间的日期,如下所示:

greater > 1 less than 12
start time : 2pm
date1: 2016-07-02 14:00
date2: 2016-07-03 14:00
date3: 2016-07-04 14:00
.
.
.
date10: 2016-07-11 14:00

我决定将这些日期存储在一个列表中:

listL = [2016-07-02 14:00,2016-07-03 14:00,2016-07-04 14:00 ... 2016-07-11 14:00]

之后,我将 ListL 中的每个日期与 DictD 中每个键的日期列表进行比较,如果 ListL 中的日期位于开始、停止时间之内,那么我应该将其从列表中删除并仅返回 ListL 中的日期不要与 DictD 中的日期重叠,我的逻辑如下:

for L from ListL:
for every key in DictD:
for item from DictD[key]:
if DictD[key][0] < L < DictD[key][1] # check if item from list overlap with start,stop time from dictionary.
ListL.remove(L) # I know I can't remove items from list while iterating so I will probably create a set and store all overlapped items and then subtract this set to set(ListL) to get the difference.
return ListL

我的问题是,我是否使用高效的数据结构来处理我的需求?我发现我的逻辑效率不高,所以我想知道是否有更好的方法来解决这个问题?

任何帮助将不胜感激。提前致谢!

最佳答案

听起来您正在尝试优化您的算法。老实说,对于这种大小的数据,可能没有必要。但是,如果您有兴趣,一般的经验法则是 sets are faster than lists在 Python 中检查成员资格时。

在这种情况下,不清楚您的集合可能是什么。我假设您最多只有一分钟级别的粒度,但您可以降低(以获得更多内存)或者通过更大的粒度来提高占用率和性能 - 例如小时。此代码显示即使是相对较大的数据集也可以至少快 5 倍(并且在比较您的数据集时看起来更简单):

from copy import copy
from datetime import datetime, timedelta
from timeit import timeit
import time

def make_range(start, open, close, days):
result = []
base_start = start + open
base_close = start + close
while days > 0:
result.append([base_start, base_close])
base_start += timedelta(days=1)
base_close += timedelta(days=1)
days -= 1
return result

def make_range2(start, open, close, days):
result = set()
base_start = start + open
base_close = start + close
while days > 0:
now = base_start
while now <= base_close:
result.add(now)
now += timedelta(minutes=1)
base_start += timedelta(days=1)
base_close += timedelta(days=1)
days -= 1
return result

dateRange = {
'range1': make_range(datetime(2016, 7, 3, 0, 0),
timedelta(hours=10),
timedelta(hours=18),
6),
}

dateRange2 = {
'range1': make_range2(datetime(2016, 7, 3, 0, 0),
timedelta(hours=10),
timedelta(hours=18),
6),
}

dateList = [
datetime(2016, 7, 2, 14, 0),
datetime(2016, 7, 3, 14, 0),
datetime(2016, 7, 4, 14, 0),
datetime(2016, 7, 5, 14, 0),
datetime(2016, 7, 6, 14, 0),
datetime(2016, 7, 7, 14, 0),
datetime(2016, 7, 8, 14, 0),
datetime(2016, 7, 9, 14, 0),
datetime(2016, 7, 10, 14, 0),
datetime(2016, 7, 11, 14, 0)
]

dateSet = set(dateList)

def f1():
result = copy(dateList)
for a in dateList:
for b in dateRange:
for i in dateRange[b]:
if i[0] <= a <= i[1]:
result.remove(a)
return result

def f2():
result = copy(dateSet)
for b in dateRange2:
result = result.difference(dateRange2[b])
return result

print(f1())
print(timeit("f1()", "from __main__ import f1", number=100000))

print(f2())
print(timeit("f2()", "from __main__ import f2", number=100000))

备案,结果如下:

[datetime.datetime(2016, 7, 2, 14, 0), datetime.datetime(2016, 7, 9, 14, 0), datetime.datetime(2016, 7, 10, 14, 0), datetime.datetime(2016, 7, 11, 14, 0)]
1.922587754837455

{datetime.datetime(2016, 7, 2, 14, 0), datetime.datetime(2016, 7, 9, 14, 0), datetime.datetime(2016, 7, 10, 14, 0), datetime.datetime(2016, 7, 11, 14, 0)}
0.30558400587733225

您也可以将 dict dateRange 转换为列表,但只有 1 或 2 个成员,这不太可能对性能产生任何真正的影响。但是,它更合乎逻辑,因为您实际上并没有使用 dict 来查找任何特定的键值——您只是遍历所有值。

关于python - 将日期时间列表与日期时间字典进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com