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")

绘图结果:

相关推荐
2301_776508727 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2401_879693877 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
I'm Jie7 小时前
Swagger UI 本地化部署,解决 FastAPI Swagger UI 依赖外部 CDN 加载失败问题
python·ui·fastapi·swagger·swagger ui
2401_846341657 小时前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
2401_879693877 小时前
进阶技巧与底层原理
jvm·数据库·python
阿_旭7 小时前
基于YOLO26深度学习的【桃子成熟度检测与分割系统】【python源码+Pyqt5界面+数据集+训练代码】图像分割、人工智能
人工智能·python·深度学习·桃子成熟度检测
蹦哒7 小时前
Kotlin 与 Java 语法差异
java·python·kotlin
jerryinwuhan8 小时前
python数据挖掘基础
python·数据挖掘·numpy
echome8888 小时前
Python 异步编程实战:asyncio 核心概念与最佳实践
开发语言·网络·python
yunyun321238 小时前
自动化与脚本
jvm·数据库·python