Python:将日期与字典列表中的日期进行比较

时间:2016-11-03 07:57:07

标签: python list datetime dictionary search

我有一个(大)词典列表,包含从Wunderlist中提取的任务及其元数据。列表的名称是tasktotal。列表中的这些词典如下所示:

{'due_date': '2016-11-30', 'created_by_request_id': 'RqID:RqIDKey', 'type': 'task', 'title': 'This is a task ', 'completed': False, 'id': MYID, 'created_by_id': MYID, 'created_at': '2016-10-14T11:11:52.916Z', 'revision': 2, 'starred': False, 'list_id': MYLISTID}

我想使用datetime将'due_date'值与当前日期进行比较:

date_today = datetime.datetime.now().date()

如果dictinary在今天或今天之前的任何一天到期,我想从此词典中返回'title'值。我认为最简单的方法是创建一个包含今天到期的所有条目的新字典,然后检索它们的“标题”值。所以我做了这个搜索功能:

def search(i):
    return [element for element in i if element[datetime.strptime('due_date')] >= date_today]

但是,当我在tasktotal列表上运行此搜索时,我什么也没有回复。

print(search(tasktotal))

[]
Process finished with exit code 0

我不明白我在做错了什么?或者是否有另一种更有效的方法来检索我需要的值?

编辑1:

当我通过@Peter尝试解决方案时,我收到此错误:

    return [element['title'] for element in i if date_convert(element['due_date']) >= current_time]
   KeyError: 'due_date

编辑2: 当我切换括号时,如@James K和@RichSmith建议,我收到此错误

    return [element for element in i if datetime.strptime(element['due_date'], "%Y-%m-%d") >= date_today]
TypeError: can't compare datetime.datetime to datetime.date

3 个答案:

答案 0 :(得分:1)

包围错误

element[datetime.strptime('due_date')]

这会尝试将字符串“due_date”转换为时间,然后在字典中查找该字符串。相反,您需要查找日期,然后转换它。

datetime.strptime(element['due_date'], "%Y-%m-%d").date() 

答案 1 :(得分:1)

如果您想要返回的标题列表,可以使用element['title']

我没有真正使用datetime这么快就把一个稍微不同的解决方案组合在一起,它将日期转换为时间戳,这样你就可以根据需要调整格式。至少对我来说,因为它是在比较数字本身而不是依靠datetime进行比较,所以看起来更健壮了。

我做了一个快速测试,大约慢了20-25%,每6k值需要1.25秒而不是1,所以它不太明显。

import datetime
import time

def date_convert(due_date):
    return time.mktime(datetime.datetime.strptime(due_date, "%Y-%m-%d").timetuple())

def search(i):
    current_time = 86400 * int(time.time() / 86400)
    future_date = '3000-01-01'
    return [element['title'] for element in i if date_convert(element.get('due_date', future_date)) <= current_time]

对于记录,弹出的86400只是为了将当前时间以秒为单位舍入到当天的开始,因为这是数据使用的最高准确度。

答案 2 :(得分:0)

我认为你需要移动你的步伐。

尝试:

def search(i):
    return [element for element in i if datetime.strptime(element["due_date"]) >= date_today]

element["due_date"]会在每个词典中获取日期。