web-dev-qa-db-ja.com

python辞書の日時をキーとして、keyError

Linuxでcronを使用してPythonスクリプトを実行しようとしています。これにより、データのディクショナリが構築されます。ディクショナリのキーとしてdatetime().now().time()を使用しようとしていますが、エラーが発生するようです。

datetime型をPythonの辞書キーとして使用することはできませんか?その場合、私の選択肢は何ですか?

コード:

time_now = dt.datetime.now().time()
date_today = dt.datetime.now().date()
usage_dict_hourly = {}
date_wise_dict = {}

def constructing_dict(data_int):
    date_wise_dict[usage_dict_hourly[time_now]] = data_int
    print date_wise_dict

エラー:

<ipython-input-9-ef6a500cc71b> in constructing_dict(data_int)
     36 
     37 def constructing_dict(data_int):
---> 38     date_wise_dict[usage_dict_hourly[time_now]] = data_int
     39     print date_wise_dict
     40 

KeyError: datetime.time(22, 40, 33, 746509)
11
user3591675

辞書キーとしての日時に関する質問への回答:

はい、datetimeのtimeオブジェクトを辞書キーとして使用できます。

オブジェクトを辞書キーとして使用するための条件:

辞書キーとして使用するには、オブジェクトはハッシュ関数(__hash__など)、等価比較(__eq__または__cmp__)(...)をサポートしている必要があります。

(出典: DictionaryKeys

引用された条件の日時サポート:

サポートされている操作:

.。

  • ハッシュ、dictキーとして使用

(出典: datetime --timeオブジェクト

ただし、dict usage_dict_hourlyが空であるため、この例外が発生します。

usage_dict_hourly{}で開始されます。したがって、関数time_nowでキーconstructing_dictを持つ要素を検索しようとすると、そのキーが見つからないため、KeyError例外が発生します。

6
emartinelli

実際には、useage_dict_hourlyをそのように設定しているわけではありません。これは、エラーです。理想的には、次のようなことを行う必要があります。

useage_dict_hourly[time_now] = None
date_wise_dict[useage_dict_hourly[time_now]] = data_int

または、さらに良いことに、キーとしてdatetime.datetime.now()を使用するだけです。

datetime_wise_date[datetime.datetime.now()] = data_int.

このように、値が衝突する可能性はありません(useage_dict_hourlyの場合、可能性は低いですが)。

1