web-dev-qa-db-ja.com

辞書をHDF5データセットに保存する方法

私は辞書を持っています。キーは日時オブジェクトで、値は整数のタプルです。

>>> d.items()[0]
(datetime.datetime(2012, 4, 5, 23, 30), (14, 1014, 6, 3, 0))

HDF5データセットに保存したいのですが、辞書をダンプしようとすると、h5pyでエラーが発生します。

TypeError:オブジェクトdtype dtype( 'object')には同等のネイティブHDF5がありません

このディクショナリを変換してHDF5データセットに格納できるようにするための「最良の」方法は何でしょうか。

具体的には、numtime配列にディクショナリをダンプするだけではなく、日付時刻クエリに基づくデータ取得が複雑になります。

25
theta

これには2つの方法があります。

I) datetimeオブジェクトを文字列に変換し、データセット名として使用します

_h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y-%m-%dT%H:%M:%SZ'), data=np.array(v, dtype=np.int8))
_

キー文字列(データセット名)をクエリすることでデータにアクセスできます。例えば:

_for ds in h.keys():
    if '2012-04' in ds:
        print(h[ds].value)
_

II) datetimeオブジェクトをデータセットサブグループに変換

_h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y/%m/%d/%H:%M'), data=np.array(v, dtype=np.int8))
_

strftime文字列のスラッシュに注意してください。これにより、HDFファイルに適切なサブグループが作成されます。 _h['2012']['04']['05']['23:30'].value_のように直接、または提供されたh5pyイテレータで反復することによって、またはvisititems()を介してカスタム関数を使用することによっても、データにアクセスできます。

簡単にするために、最初のオプションを選択します。

14
theta

この質問は、あらゆる種類の辞書をHDF5形式で保存できるというより一般的な質問に関係しています。まず、辞書を文字列に変換します。次に、辞書を回復するには、import astコマンドを使用してastライブラリを使用します。次のコードは例を示します。

>>> d = {1:"a",2:"b"}
>>> s = str(d)
>>> s
"{1: 'a', 2: 'b'}"
>>> ast.literal_eval(s)
{1: 'a', 2: 'b'}
>>> type(ast.literal_eval(s))
<type 'dict'>
8
Ameet Deshpande

今日私達はdeepdish(www.deepdish.io)を持っています:

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
5
wordsforthewise

オブジェクトをJSONまたはYAMLにシリアル化し、結果の文字列を属性として適切なオブジェクト(HDF5グループまたはデータセット)に格納します。

データセット名として日時を使用している理由はわかりませんが、日時で直接データセットを検索する必要がある場合を除きます。

pS価値があるのは PyTablesは低レベルのh5pyよりもはるかに使いやすい です。

5
Jason S