我有一个(大)词典列表,包含从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
答案 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"]
会在每个词典中获取日期。