fit parse解析佳明.fit 运动数据,模仿zwift数据展示

fitparse是一个用于解析 Garmin .FIT 文件的Python库。

本文中主要用到fitparse库来解析、提取数据;maplotlib库用来进行可视化绘制。

定义get_fit_list函数,其功能为:读取fit文件中的全部数据,并返回一个list。

使用fitparse.FitFile()函数读取fit文件,返回一个FitFile对象,使用list方法将其转换成list,其中每个元素为一个DataMessage对象。

python 复制代码
def get_fit_list(file_name):
    m_fit_file = fitparse.FitFile(file_name)
    return list(m_fit_file.get_messages())

获取数据list后,使用DataMessage.get_value()方法获取指定的字段。例如heartrate、 power、 cadence等。

python 复制代码
    m_fit_file = get_fit_list(file_name)
    for i in m_fit_file:
        m_heart_rate.append(i.get_value('heart_rate'))
        m_power.append(i.get_value('power'))

matplotlib参数进行初始设置:

python 复制代码
    matplotlib.rc('figure', figsize=(40, 10))  # 图片大小,单位厘米
    matplotlib.rc('font', size=20)  # 字体大小
    matplotlib.rc('axes', grid=False)  # 是否显示网格
    matplotlib.rc('axes', facecolor='white')  # 背景颜色
    plt.title('Entire Workout')
    plt.xlabel('Time(s)')  # 横坐标

划分功率区间zone1到zone7,将功率数据分类,具体分类见下表:

区间 含义 功率
zone1 主动恢复区 FTP的55%以下
zone2 有氧耐力区 FTP的55%~75%
zone3 节奏强度或高阶有氧区 FTP的75%~90%
zone4 乳酸强度区 FTP的90%~105%
zone5 最大摄氧量强度区 FTP的105%~120%
zone6 无氧能力强度区 FTP的120%~150%
zone7 神经肌肉能力区 FTP的150%以上

详细内容参考开元老师的文章:zhuanlan.zhihu.com/p/356084873

python 复制代码
data_len = len(m_power)
    z1 = [0] * data_len
    z2 = [0] * data_len
    z3 = [0] * data_len
    z4 = [0] * data_len
    z5 = [0] * data_len
    z6 = [0] * data_len
    z7 = [0] * data_len
    for i in range(len(m_power)):
        df = m_power[i]
        if df != None:
            if df >= 0 and df <= 0.5 * ftp:
                z1[i] = df
            if df > 0.5 * ftp and df <= 0.75 * ftp:
                z2[i] = df
            if df > 0.75 * ftp and df <= 0.9 * ftp:
                z3[i] = df
            if df > 0.9 * ftp and df <= 1.05 * ftp:
                z4[i] = df
            if df > 1.05 * ftp and df <= 1.2 * ftp:
                z5[i] = df
            if df > 1.2 * ftp and df <= 1.5 * ftp:
                z6[i] = df
            if df > 1.5 * ftp:
                z7[i] = df

绘制心率曲线图,并标记max heart rate:

ini 复制代码
    plt.plot(m_heart_rate, label='HeartRate', linewidth=1, color='red')
    max_HR = max(m_heart_rate)
    max_HR_Index = m_heart_rate.index(max_HR)
    max_hr = 'Max HR:' + str(max_HR)
    plt.annotate(max_hr, (max_HR_Index, max_HR), color='red')

根据功率区间按照不同颜色绘图:

ini 复制代码
    _x = np.arange(len(m_power))
    plt.bar(_x, z1, color='grey')
    plt.bar(_x, z2, color='royalblue')
    plt.bar(_x, z3, color='lime')
    plt.bar(_x, z4, color='orange')
    plt.bar(_x, z5, color='red')
    plt.bar(_x, z6, color='firebrick')
    plt.bar(_x, z7, color='darkred')
    plt.savefig("fit_analyze.jpg")

绘图结果:

相关推荐
翻斗包菜1 分钟前
第 03 章 Python 操作 MySQL 数据库实战全解
数据库·python·mysql
xcjbqd014 分钟前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
white-persist24 分钟前
【vulhub spring CVE-2018-1270】CVE-2018-1270 Spring Messaging 远程命令执行漏洞 完整复现详细分析解释
java·服务器·网络·数据库·后端·python·spring
EnCi Zheng31 分钟前
P2G-Python字符串方法完全指南-split、join、strip、replace的Python编程利器
开发语言·python
潇洒畅想32 分钟前
1.1 从∑到∫:用循环理解求和与累积
java·数据结构·python·算法
有一个好名字33 分钟前
Claude Code 50+命令全解析
python
liliangcsdn44 分钟前
LLM如何与mcp server交互示例
linux·开发语言·python
Lupino1 小时前
拯救迷失的荧光溶解氧传感器:从“三无”到“复活”的全记录
python
xcjbqd01 小时前
SQL中视图能否嵌套存储过程_实现复杂自动化报表逻辑
jvm·数据库·python
ZC跨境爬虫1 小时前
海南大学交友平台开发实战day7(实现核心匹配算法+解决JSON请求报错问题)
前端·python·算法·html·json