30

キーが日時オブジェクトで、値が整数のタプルである辞書があります。

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

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

TypeError: オブジェクト dtype dtype('object') にはネイティブ HDF5 に相当するものはありません

HDF5 データセットに格納できるように、この辞書を変換する「最良の」方法は何でしょうか?

具体的には、日時クエリに基づくデータ取得が複雑になるため、ディクショナリを numpy 配列にダンプしたくありません。

4

5 に答える 5

16

これには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))

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

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

于 2013-05-11T09:31:17.740 に答える
6

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

ただし、日時でデータセットを直接検索する必要が絶対にない限り、日時をデータセット名として使用している理由はわかりません。

ps 価値のあることとして、PyTables は低レベルの h5py よりもはるかに使いやすいです

于 2013-12-20T17:56:09.743 に答える