使用 fitparse 解析 佳明 fit 文件
以下示例测试环境为:
python 3.8 fitparse 1.2
fitparse
安装
pip3 install fitparse
使用方式
import fitparse
from datetime import timedelta
def get_message(file_name):
file = fitparse.FitFile(file_name)
message = file.messages
for item in message:
print(item.name)
print(item.as_dict())
if item.name == 'file_id':
print(item.as_dict())
if item.name == 'session':
print(item.get_value('sport'))
start_time = item.get_value('start_time') + timedelta(hours=8)
end_time = item.get_value('timestamp') + timedelta(hours=8)
"""
获取所有点的GPS数据
佳明在fit文件中使用的是 semicircles(圆度值) 来记录GPS,比通用的wgs84要更加精准,转换关系如下
degrees = semicircles * ( 180 / 2^31 )
semicircles = degrees * ( 2^31 / 180 )
"""
try:
print(item.get_value('position_lat') * (180 / 2 ** 31), item.get_value('position_long') * (180 / 2 ** 31))
print(item.as_dict())
except TypeError:
continue
附件
file_id 行内(部分)信息展示
该信息只作为参考,实际使用时,请自己打印该行信息:
import datetime
file_id = {'name': 'file_id', 'fields': [
{'name': 'serial_number', 'def_num': 3, 'base_type': 'uint32z', 'type': 'uint32z', 'units': None, 'value': 3950...83, 'raw_value': 3950...83},
{'name': 'time_created', 'def_num': 4, 'base_type': 'uint32', 'type': 'date_time', 'units': None, 'value': datetime.datetime(2018, 1, 24, 4, 52, 23), 'raw_value': 885703943},
{'name': 'manufacturer', 'def_num': 1, 'base_type': 'uint16', 'type': 'manufacturer', 'units': None, 'value': 'garmin', 'raw_value': 1},
{'name': 'garmin_product', 'def_num': 2, 'base_type': 'uint16', 'type':'garmin_product', 'units': None, 'value': 2533, 'raw_value': 2533},]}
session 行内(部分)信息展示
session 内都是当前fit文件的聚集信息
该信息只作为参考,实际使用时,请自己打印该行信息:
session = {'name': 'session', 'fields': [
{'name': 'timestamp', 'def_num': 253, 'base_type': 'uint32', 'type': 'date_time', 'units': None, 'value': datetime.datetime(2018, 3, 25, 10, 26, 57), 'raw_value': 890908017},
{'name': 'start_time', 'def_num': 2, 'base_type': 'uint32', 'type': 'date_time', 'units': None, 'value': datetime.datetime(2018, 3, 25, 0, 17, 20), 'raw_value': 890871440},
.
.
.
{'name': 'total_timer_time', 'def_num': 8, 'base_type': 'uint32', 'type': 'uint32', 'units': 's','value': 25048.871, 'raw_value': 25048871},
{'name': 'total_distance', 'def_num': 9, 'base_type': 'uint32', 'type': 'uint32', 'units': 'm', 'value': 88924.04,'raw_value': 8892404},
.
.
.
{'name': 'time_in_hr_zone', 'def_num': 65, 'base_type': 'uint32', 'type': 'uint32', 'units': 's',
'value': (778.726, 5631.959, 7464.129, 4913.151, 4478.913, 1204.132, 0.0),
'raw_value': (778726, 5631959, 7464129, 4913151, 4478913, 1204132, 0)},
{'name': 'time_in_power_zone', 'def_num': 68, 'base_type': 'uint32', 'type': 'uint32', 'units': 's',
'value': (13527.302, 1585.171, 1841.759, 990.07, 935.986, 813.014, 1078.521, 1631.342, 0.0, 0.0),
'raw_value': (13527302, 1585171, 1841759, 990070, 935986, 813014, 1078521, 1631342, 0, 0)},
.
.
.
{'name': 'total_calories', 'def_num': 11, 'base_type': 'uint16', 'type': 'uint16', 'units': 'kcal', 'value': 1979,'raw_value': 1979},
{'name': 'avg_speed', 'def_num': 14, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm/s', 'value': 3.55,'raw_value': 3550},
{'name': 'max_speed', 'def_num': 15, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm/s', 'value': 15.76,'raw_value': 15760},
{'name': 'avg_power', 'def_num': 20, 'base_type': 'uint16', 'type': 'uint16', 'units': 'watts', 'value': 83,'raw_value': 83},
{'name': 'max_power', 'def_num': 21, 'base_type': 'uint16', 'type': 'uint16', 'units': 'watts', 'value': 1591,'raw_value': 1591},
{'name': 'total_ascent', 'def_num': 22, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm', 'value': 626,'raw_value': 626},
{'name': 'total_descent', 'def_num': 23, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm', 'value': 647,'raw_value': 647},
{'name': 'training_stress_score', 'def_num': 35, 'base_type': 'uint16', 'type': 'uint16', 'units': 'tss','value': 770.3, 'raw_value': 7703},
{'name': 'intensity_factor', 'def_num': 36, 'base_type': 'uint16', 'type': 'uint16', 'units': 'if', 'value': 1.113,'raw_value': 1113},
{'name': 'sport', 'def_num': 5, 'base_type': 'enum', 'type': 'sport', 'units': None, 'value': 'cycling','raw_value': 2},
{'name': 'sub_sport', 'def_num': 6, 'base_type': 'enum', 'type': 'sub_sport', 'units': None, 'value': 'generic','raw_value': 0},
{'name': 'avg_heart_rate', 'def_num': 16, 'base_type': 'uint8', 'type': 'uint8', 'units': 'bpm', 'value': 128,'raw_value': 128},
{'name': 'max_heart_rate', 'def_num': 17, 'base_type': 'uint8', 'type': 'uint8', 'units': 'bpm', 'value': 179,'raw_value': 179},
{'name': 'avg_cadence', 'def_num': 18, 'base_type': 'uint8', 'type': 'uint8', 'units': 'rpm', 'value': 68,'raw_value': 68},
{'name': 'max_cadence', 'def_num': 19, 'base_type': 'uint8', 'type': 'uint8', 'units': 'rpm', 'value': 172,'raw_value': 172},]}
.
.
.
record 行内(部分)信息展示
每个record都是一个GPS点, 里面都是当前GPS点的瞬时信息
该信息只作为参考,实际使用时,请自己打印该行信息:
record = {'name': 'record', 'fields': [
{'name': 'timestamp', 'def_num': 253, 'base_type': 'uint32', 'type': 'date_time', 'units': None,'value': datetime.datetime(2018, 3, 25, 10, 19, 11), 'raw_value': 890907551},
{'name': 'position_lat', 'def_num': 0, 'base_type': 'sint32', 'type': 'sint32', 'units': 'semicircles','value': 365908323, 'raw_value': 365908323},
{'name': 'position_long', 'def_num': 1, 'base_type': 'sint32', 'type': 'sint32', 'units': 'semicircles','value': 1241201927, 'raw_value': 1241201927},
{'name': 'distance', 'def_num': 5, 'base_type': 'uint32', 'type': 'uint32', 'units': 'm', 'value': 86430.14,'raw_value': 8643014},
{'name': 'accumulated_power', 'def_num': 29, 'base_type': 'uint32', 'type': 'uint32', 'units': 'watts','value': 1801134, 'raw_value': 1801134},
{'name': 'enhanced_altitude', 'def_num': 78, 'base_type': 'uint32', 'type': 'uint32', 'units': 'm','value': 452.79999999999995, 'raw_value': 452.79999999999995},
{'name': 'altitude', 'def_num': 2, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm','value': 452.79999999999995, 'raw_value': 4764},
{'name': 'enhanced_speed', 'def_num': 73, 'base_type': 'uint32', 'type': 'uint32', 'units': 'm/s', 'value': 8.659,'raw_value': 8.659},
{'name': 'speed', 'def_num': 6, 'base_type': 'uint16', 'type': 'uint16', 'units': 'm/s', 'value': 8.659,'raw_value': 8659},
{'name': 'power', 'def_num': 7, 'base_type': 'uint16', 'type': 'uint16', 'units': 'watts', 'value': 191,'raw_value': 191},
{'name': 'heart_rate', 'def_num': 3, 'base_type': 'uint8', 'type': 'uint8', 'units': 'bpm', 'value': 151,
'raw_value': 151},
{'name': 'cadence', 'def_num': 4, 'base_type': 'uint8', 'type': 'uint8', 'units': 'rpm', 'value': 95,'raw_value': 95},
{'name': 'temperature', 'def_num': 13, 'base_type': 'sint8', 'type': 'sint8', 'units': 'C', 'value': 20,'raw_value': 20},]}
|