Python 如何有效地比较datetime对象
我有一本大约15k条记录的字典,其格式如下: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
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...")