私は辞書を持っています。キーは日時オブジェクトで、値は整数のタプルです。
>>> d.items()[0]
(datetime.datetime(2012, 4, 5, 23, 30), (14, 1014, 6, 3, 0))
HDF5データセットに保存したいのですが、辞書をダンプしようとすると、h5pyでエラーが発生します。
TypeError:オブジェクトdtype dtype( 'object')には同等のネイティブHDF5がありません
このディクショナリを変換してHDF5データセットに格納できるようにするための「最良の」方法は何でしょうか。
具体的には、numtime配列にディクショナリをダンプするだけではなく、日付時刻クエリに基づくデータ取得が複雑になります。
これには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()
を介してカスタム関数を使用することによっても、データにアクセスできます。
簡単にするために、最初のオプションを選択します。
この質問は、あらゆる種類の辞書を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'>
今日私達はdeepdish(www.deepdish.io)を持っています:
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
オブジェクトをJSONまたはYAMLにシリアル化し、結果の文字列を属性として適切なオブジェクト(HDF5グループまたはデータセット)に格納します。
データセット名として日時を使用している理由はわかりませんが、日時で直接データセットを検索する必要がある場合を除きます。
pS価値があるのは PyTablesは低レベルのh5pyよりもはるかに使いやすい です。