2016-11-03 23 views
1

Wunderlistから抽出されたタスクとそのメタデータを含む辞書リスト(大規模なリスト)があります。リストの名前はtasktotalです。リスト内のこれらの辞書は、次のようになります。Python:辞書のリスト内の日付と日付の比較

{'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」の値を比較したいと思います

:dictinaryは今日または前日によるものであれば

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

今日、私はこの辞書から 'タイトル'の値を返したいと思います。私は最も簡単な方法は今日のすべてのエントリを持つ新しい辞書を作成し、次に彼らの 'タイトル'の値を取得することであると考えた。だから私は、この検索機能を作った:

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つの効率的な方法がありますか?

EDIT 1:

私は@Peterによるソリューションをしようとすると、私はこのエラーを取得:

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

EDIT 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

各回答には、その回答の特定のメッセージを使って直接返信することができます。 –

+0

申し訳ありません、ここではかなり新しい、チップのおかげで! –

答えて

0

私はあなたがstrptime。

試してみてください。

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

element["due_date"]があなたの辞書のそれぞれに日付をフェッチする方法。

+0

あなたが引数の一つを忘れた –

1

ブラケティングは、これは、時間に文字列「DUE_DATE」を変換し、辞書でそれを検索しようとする

element[datetime.strptime('due_date')] 

のために間違っています。代わりに、日付を検索してから変換する必要があります。

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

もちろん!しかし、それでも#Peterと同じエラーが返されます:datetime.strptime(要素['due_date']、 "%Y-%m-%d")> = date_todayの場合、i要素のreturn要素[ ] TypeError:できませんdatetime.datetimeとdatetime.dateを比較してください。 –

+1

答えは引数の1つを忘れていましたが、修正しました。型を修正するには、datetime.strptimeがdatetimeを返します。これは日付と直接比較できません。しかし、最初に.date()を呼び出して日付に変換することができます –

+0

答えに組み込まれています。 –

1

返されるタイトルのリストを希望する場合は、element['title']を使用してください。

私は本当にdatetimeを使用していないので、少し違う解決策が得られました。日付をタイムスタンプに変換し、必要に応じてフォーマットを調整できます。少なくとも私には比較のためにdatetimeに頼るのではなく、数値自体を比較しているので、もう少し頑強に思えます。

私はクイックテストを行いました。これはおおよそ20-25%遅く、1とは対照的に6kの値に対して1.25秒かかるため、それほど目立ちません。レコードの

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は、ちょうど一日の始まりに丸め秒で現在の時刻を取得することです。

+0

私はそれが好きです!しかし、今私は別のエラーがあります:戻り値[要素['タイトル']の場合、date_convert(要素['due_date'])> = current_time] KeyError: 'due_date –

+0

@kenny Ostromこれは本当かもしれない、辞書Wunderlistアカウントから抽出されます。すべてのタスクに期日があるわけではないので、すべての辞書に 'due_date'要素があるわけではありません。これはこのアプローチの問題ですか? –

+0

実際のデータが異なるため、これはあなたが与えたデータでは有効ですが、実際のデータでは機能しません。私はelement ['due_date']の代わりにelement.get( 'due_date'、デフォルト)を使用することをお勧めします。または、要素の 'due_date'をチェックすることによって、悪いエントリを無視することができます... - 申し訳ありませんより良いものを書き直すために私のコメントを削除しました。 –