Python 如何有效地比较datetime对象

Python 如何有效地比较datetime对象,python,python-datetime,Python,Python Datetime,我有一本大约15k条记录的字典,其格式如下: sample = {0: {'Schedule': ['2017-05-11', '2019-04-30', '2018-10-13', '2019-05-31', '', '']}, 1: {'Schedule': ['2017-05-09', '2019-05-31', '', '', '2018-10-13', '2019-05-31']}, 2: {'Schedule': ['2017-05-02', '2020-02

我有一本大约15k条记录的字典,其格式如下:

sample = {0: {'Schedule': ['2017-05-11', '2019-04-30', '2018-10-13', '2019-05-31', '', '']},
      1: {'Schedule': ['2017-05-09', '2019-05-31', '', '', '2018-10-13', '2019-05-31']},
      2: {'Schedule': ['2017-05-02', '2020-02-29', '', '', '2018-10-12', '2020-02-29']}}
现在,我必须将
'Schedule'
中的第一、第三和第五个日期与两个datetime对象进行比较,看看是否在范围内。我正在做下面的工作,但是结果非常慢,大约需要20秒。有人能提出一种更有效的搜索方法吗

完整示例代码:

from datetime import datetime

sample = {0: {'Schedule': ['2017-05-11', '2019-04-30', '2018-10-13', '2019-05-31', '', '']},
          1: {'Schedule': ['2017-05-09', '2019-05-31', '', '', '2018-10-13', '2019-05-31']},
          2: {'Schedule': ['2017-05-02', '2020-02-29', '', '', '2018-10-12', '2020-02-29']}}

start_date = datetime.date(datetime.strptime("2018-10-12","%Y-%m-%d"))
end_date = datetime.date(datetime.strptime("2018-10-16","%Y-%m-%d"))

for k,v in sample.items():
    earliest = [dt for dt in [v["Schedule"][0],v["Schedule"][2],v["Schedule"][4]] if dt] #only need to check these 3 starting dates
    def check_earliest(_list):  #check if any date meets search criteria
        for i in _list:
            if start_date <= datetime.date(datetime.strptime(i, "%Y-%m-%d")) <= end_date:
                return True
    if check_earliest(earliest):
        print ("Do something here...")
从日期时间导入日期时间
样本={0:{'Schedule':['2017-05-11','2019-04-30','2018-10-13','2019-05-31','','','''.]},
1:{'Schedule':['2017-05-09','2019-05-31','2018-10-13','2019-05-31'],
2:{'Schedule':['2017-05-02','2020-02-29','2018-10-12','2020-02-29']}
开始日期=datetime.date(datetime.strtime(“2018-10-12,%Y-%m-%d”))
end_date=datetime.date(datetime.strtime(“2018-10-16,%Y-%m-%d”))
对于sample.items()中的k,v:
最早=[v[“计划”][0]、v[“计划”][2]、v[“计划”][4]]中的dt的dt,如果dt]#只需要检查这3个开始日期
def check_Earlime(_list):#检查任何日期是否符合搜索条件
对于i in_列表:

如果start_date不使用datetime对象,或者在字典中以
datetime
对象开头,那么您不必仅为了进行比较而转换它们

您不必使用
datetime
对象,因为您的日期是按YYYY-MM-DD顺序排列的。这些日期(如字符串)在字典上可以按照正确的日期顺序进行比较

所以


对于代码的其他区域来说,一次将字符串解析为
date()
实例可能很有用,而不是每次需要
datetime.date()
对象时都使用字符串并将其转换。对于这里的比较,这并不是真正需要的。

不要使用datetime对象,或者从字典中的
datetime
对象开始,这样您就不必仅为了进行比较而转换它们

您不必使用
datetime
对象,因为您的日期是按YYYY-MM-DD顺序排列的。这些日期(如字符串)在字典上可以按照正确的日期顺序进行比较

所以


对于代码的其他区域来说,一次将字符串解析为
date()
实例可能很有用,而不是每次需要
datetime.date()
对象时都使用字符串并将其转换。对于这里的比较,这并不是真正需要的。

datetime.date
解析datetime对象已经是一个巨大的瓶颈。日期字符串已经是ISO 8601格式,因此您不需要解析。使用
datetime.date
解析datetime对象已经是一个巨大的瓶颈。日期字符串已经是ISO8601格式,所以你不需要解析。你是救世主!节省的时间是巨大的。对于
any()
部分,我会使用它,但我必须在我的实际代码中做一些过滤,即
earlime=[dt For dt in[j[“Schedule”][0],j[“Schedule”][2],j[“Schedule”][4],j[“Schedule”][6],j[“Schedule”][8]]如果dt而不是dt.isalnum(),
@HenryYik:这不是一个真正的问题;您也可以使用
any()
<代码>如果有(sched[i]和sched[i].isalnum()和start_date你是救世主!节省的时间是巨大的。对于
any()
部分,我本来会使用它,但我必须在我的实际代码中做一些过滤,即
最早=[j[“Schedule”][0],j[“Schedule”][2],j[“Schedule”][4],j[“Schedule”[6],j[“Schedule”][8]]如果是dt而不是dt.isalnum()]
@HenryYik:这不是一个真正的问题;你也可以使用
any()
;如果有(sched[i]和sched[i].isalnum()和start\u date
start_date = "2018-10-12"
end_date = "2018-10-16"

for k,v in sample.items():
    sched = v['Schedule']
    earliest = [dt for dt in (sched[0], sched[2], sched[4]) if dt]
    def check_earliest(l):
        for i in l:
            if start_date <= i <= end_date:
                return True
    if check_earliest(earliest):
        print("Do something here...")
for k, v in sample.items():
    sched = v['Schedule']
    if any(sched[i] and start_date <= sched[i] <= end_date for i in (0, 2, 4)):
        print ("Do something here...")