Чтение / анализ и анализ файла Wahoo TICKR X .fit в Python - PullRequest
0 голосов
/ 26 марта 2020

Не уверен, что смогу опубликовать такой вопрос здесь, поэтому, пожалуйста, перенаправьте меня, если я не в том месте.

Я купил Wahoo TICKR X, чтобы контролировать мой пульс во время тренировки. Кроме того, я хотел бы поближе познакомиться с python, поэтому я решил, что хотел бы сделать анализ своего сердечного ритма самостоятельно в python, а не в приложении wahoo. Я думал, что это также даст больше свободы в выборе визуализации, тестировании и т. Д. c.

Я записал свой пульс в течение 5 минут или около того и экспортировал файл .fit. Однако я даже не могу найти подходящую библиотеку для чтения файла .fit. Кто-нибудь может порекомендовать библиотеку, которая работает с файлом .fit от wahoo?

Я использую Ubuntu, Anaconda, python 3,7

import pyfits

# Load the FITS file into the program
hdulist = pyfits.open('/home/bradmin/Downloads/2020-03-26.fit')

# Load table data as tbdata
tbdata = hdulist[1].data



OSError                                   Traceback (most recent call last)
<ipython-input-3-a970e2cd9dee> in <module>
      2 
      3 # Load the FITS file into the program
----> 4 hdulist = pyfits.open('/home/bradmin/Downloads/2020-03-26.fit')
      5 
      6 # Load table data as tbdata

~/anaconda3/lib/python3.7/site-packages/pyfits/hdu/hdulist.py in fitsopen(name, mode, memmap, save_backup, **kwargs)
    122         raise ValueError('Empty filename: %s' % repr(name))
    123 
--> 124     return HDUList.fromfile(name, mode, memmap, save_backup, **kwargs)
    125 
    126 

~/anaconda3/lib/python3.7/site-packages/pyfits/hdu/hdulist.py in fromfile(cls, fileobj, mode, memmap, save_backup, **kwargs)
    264 
    265         return cls._readfrom(fileobj=fileobj, mode=mode, memmap=memmap,
--> 266                              save_backup=save_backup, **kwargs)
    267 
    268     @classmethod

~/anaconda3/lib/python3.7/site-packages/pyfits/hdu/hdulist.py in _readfrom(cls, fileobj, data, mode, memmap, save_backup, **kwargs)
    853             # raise and exception
    854             if mode in ('readonly', 'denywrite') and len(hdulist) == 0:
--> 855                 raise IOError('Empty or corrupt FITS file')
    856 
    857             # initialize/reset attributes to be used in "update/append" mode

OSError: Empty or corrupt FITS file



ссылка на файл: https://wetransfer.com/downloads/6d054a5d52899aefcb1bcd22bda92ba120200326161849/b9831a

РЕДАКТИРОВАТЬ

Я пытался это сейчас, но я получаю сообщение об ошибке:

import fitdecode

src_file = "/home/bradmin/Downloads/2020-03-26.fit"

with fitdecode.FitReader(src_file) as fit:
    for frame in fit:
        # The yielded frame object is of one of the following types:
        # * fitdecode.FitHeader
        # * fitdecode.FitDefinitionMessage
        # * fitdecode.FitDataMessage
        # * fitdecode.FitCRC

        if isinstance(frame, fitdecode.FitDataMessage):
            # Here, frame is a FitDataMessage object.
            # A FitDataMessage object contains decoded values that
            # are directly usable in your script logic.
            print(frame.name)

file_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
developer_data_id
field_description
field_description
field_description
field_description

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-7-e8d95d3087dc> in <module>
      2 
      3 with fitdecode.FitReader(src_file) as fit:
----> 4     for frame in fit:
      5         # The yielded frame object is of one of the following types:
      6         # * fitdecode.FitHeader

~/anaconda3/lib/python3.7/site-packages/fitdecode/reader.py in __iter__(self)
    191 
    192     def __iter__(self):
--> 193         yield from self._read_next()
    194 
    195     @property

~/anaconda3/lib/python3.7/site-packages/fitdecode/reader.py in _read_next(self)
    298                 assert self._header
    299 
--> 300                 record = self._read_record()
    301                 if not record:
    302                     break

~/anaconda3/lib/python3.7/site-packages/fitdecode/reader.py in _read_record(self)
    443                     self._add_dev_data_id(message)
    444                 elif message.mesg_type.mesg_num == profile.MESG_NUM_FIELD_DESCRIPTION:
--> 445                     self._add_dev_field_description(message)
    446 
    447         return message

~/anaconda3/lib/python3.7/site-packages/fitdecode/reader.py in _add_dev_field_description(self, message)
    780         base_type_id = message.get_field('fit_base_type_id').raw_value
    781         field_name = message.get_field('field_name').raw_value
--> 782         units = message.get_field('units').raw_value
    783 
    784         try:

~/anaconda3/lib/python3.7/site-packages/fitdecode/records.py in get_field(self, field_name_or_num, idx)
    188         raise KeyError(
    189             f'field "{field_name_or_num}" (idx #{idx}) not found in ' +
--> 190             f'message "{self.name}"')
    191 
    192     def get_fields(self, field_name_or_num):

KeyError: 'field "units" (idx #0) not found in message "field_description"'





1 Ответ

0 голосов
/ 26 марта 2020

Формат выглядит как этот формат FIT . Кажется, pyfits для совершенно другого формата.

В вышеприведенной статье упоминается инструмент gpsbabel, который можно использовать для преобразования файла FIT во что-то более совместимое и удобное, например, GPX ( XML формат, который легко анализировать).

Или, конечно, если вы хотите чисто Python решение, вы можете перенести биты чтения формата FIT из gpsbabel до Python использовать библиотеку fitdecode.

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