Matlab - читать массив временных рядов .mat 7.3 в Python с помощью h5py - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь прочитать файл matlab, созданный коллегой. Я использую Python 3.7 и h5py для преобразования данных в формат Comtrade. Данные из Matlab находятся в прикрепленном скриншоте: Timeseries Matalab Скриншот

Мне нужно иметь доступ к данным временного ряда, которые хранятся в массиве. Я провел день, рассматривая различные советы и приемы здесь и здесь , но, похоже, застрял. Я не могу адресовать данные или даже найти сигналы. У меня есть образец в простой файл, который должен иметь 3 сигнала, как показано выше, и я пытаюсь извлечь данные:

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
>>> import h5py as h5
... mat_dir = r'C:\Users\Perry\Desktop\testing\Matlab'
... file_name = r'\threePhaseSignal.mat'
... f = h5.File(mat_dir + file_name, 'r')
>>> list(f.keys())
['#refs#', '#subsystem#', 'tfrOut']
>>> tfr = f['tfrOut']
>>> tfr['signals']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 506, in __getitem__
    new_dtype = readtime_dtype(self.id.dtype, names)
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 48, in readtime_dtype
    raise ValueError("Field names only allowed for compound types")
ValueError: Field names only allowed for compound types
>>> tfr['Time']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 506, in __getitem__
    new_dtype = readtime_dtype(self.id.dtype, names)
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 48, in readtime_dtype
    raise ValueError("Field names only allowed for compound types")
ValueError: Field names only allowed for compound types
>>> tfr.dtype
dtype('uint32')
>>> tfr.ref
<HDF5 object reference>
>>> tfr.value
C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py:313: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.
  "Use dataset[()] instead.", H5pyDeprecationWarning)
array([[3707764736,          2,          1,          1,          1,
                 5]], dtype=uint32)
>>> tfr[0,0]
3707764736
>>> tfr['Data:1'][0,0]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 506, in __getitem__
    new_dtype = readtime_dtype(self.id.dtype, names)
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\dataset.py", line 48, in readtime_dtype
    raise ValueError("Field names only allowed for compound types")
ValueError: Field names only allowed for compound types

Очевидно, что tfr - это ссылка на объект, но я не могу ничего с этим поделать. Кто-нибудь знает, как я могу использовать это для фактического обращения к данным временных рядов? Или даже найти мои сигналы?

Я также пробовал это:

>>> for element in tfr:
...     data = f[element][0][:]
...     
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.2\helpers\pydev\_pydevd_bundle\pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<string>", line 2, in <module>
  File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\group.py", line 262, in __getitem__
    oid = h5o.open(self.id, self._e(name), lapl=self._lapl)
  File "C:\Program Files\Python37\lib\site-packages\h5py\_hl\base.py", line 137, in _e
    name = name.encode('ascii')
AttributeError: 'numpy.ndarray' object has no attribute 'encode'
>>> element
array([3707764736,          2,          1,          1,          1,
                5], dtype=uint32)

1 Ответ

0 голосов
/ 14 марта 2019

Это не решение, а скорее обходной путь, так как я борюсь с той же проблемой.Вы можете преобразовать все данные TimeSeries в файле *.mat в двухмерные массивы, содержащие значения времени и данных из TimeSeries, а затем сохранить их в другом файле *.mat.Как только это будет сделано, и вы загрузите файл, как вы сделали выше, trf.value отобразит массив, содержащий данные.Просто не забудьте сохранить файл *.mat с параметром -v7.3, если вы хотите продолжать использовать h5py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...