Python中的Wahoo ticker X.fit文件读取/解析和分析

2024-05-23 14:09:15 发布

您现在位置:Python中文网/ 问答频道 /正文

不确定我是否可以在这里发布这样的问题,所以如果我在错误的地方,请重定向我

我买了一个Wahoo Ticker X来监测我运动时的心率。另外,我想更熟悉python,所以我决定自己用python而不是wahoo应用程序来分析我的心率。我想这也会让你在选择可视化、测试等方面有更多的自由

我记录了大约5分钟的心率,并导出了.fit文件。但是,我甚至找不到合适的库来读取.fit文件。有人能推荐一个使用wahoo的.fit文件的库吗

我正在使用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"'






Tags: nameinselfidfielddevelopermessagedata
1条回答
网友
1楼 · 发布于 2024-05-23 14:09:15

格式似乎是this FIT formatpyfits似乎是一种完全不同的格式

上面的文章提到了一个gpsbabel工具,您可以使用它将FIT文件转换为更具互操作性和可用性的文件,例如GPX(一种易于解析的基于XML的格式)

当然,如果您想要一个纯Python解决方案,您可以使用port the FIT format reading bits from gpsbabel到Python使用^{}

相关问题 更多 >