如何有效地比较日期时间对象
How to compare datetime object effectively
我有一本包含大约 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'
中的第一个、第三个和第五个日期与两个日期时间对象进行比较,看看是否在范围内。我正在执行以下操作,但结果很慢,大约需要 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...")
不要使用日期时间对象,或以字典中的 datetime
对象开头,这样您就不必为了比较而转换它们。
您不必使用 datetime
对象,因为您的日期是按 YYYY-MM-DD 顺序排列的,即 ISO 8601 definition。这样的日期,作为字符串,按字典顺序 可以按日期的正确顺序进行比较。
所以
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...")
已经可以正常工作了。
我会在此处使用 any()
函数来测试您的日期,而不是定义您自己的函数:
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...")
将字符串解析为 date()
个实例 一次 可能对代码的其他区域很有用,而不是在每次需要时使用字符串并转换它们datetime.date()
对象。对于这里只是这个比较,这并不是真正需要的。
我有一本包含大约 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'
中的第一个、第三个和第五个日期与两个日期时间对象进行比较,看看是否在范围内。我正在执行以下操作,但结果很慢,大约需要 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...")
不要使用日期时间对象,或以字典中的 datetime
对象开头,这样您就不必为了比较而转换它们。
您不必使用 datetime
对象,因为您的日期是按 YYYY-MM-DD 顺序排列的,即 ISO 8601 definition。这样的日期,作为字符串,按字典顺序 可以按日期的正确顺序进行比较。
所以
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...")
已经可以正常工作了。
我会在此处使用 any()
函数来测试您的日期,而不是定义您自己的函数:
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...")
将字符串解析为 date()
个实例 一次 可能对代码的其他区域很有用,而不是在每次需要时使用字符串并转换它们datetime.date()
对象。对于这里只是这个比较,这并不是真正需要的。