Loading... # 引言 最近开始关注健康了,小米设备用了好几年了,从小米手环2到小米手表S4,见证了科技的发展和可穿戴设备普及,但是每次查看健康数据要从指定的APP中查看,并且不能自定义的去分析数据(比如每日对比,同期比较等),虽然这东西没啥用吧,但是数据在自己手,无论是使用python,还是excel,都是可以按照自己希望的方式去展示想看的内容的。 # 数据导出 <div class="tip inlineBlock success simple"> 这是非侵入式,简单易操作的方法进行数据导出,如果有root,应该更简单了吧(手头没有设备/模拟器,暂时无法测试。) 1. 需要一台联网的设备,手机电脑都可以 </div> 首先登录小米账号:https://account.xiaomi.com/ 选择隐私中心(这里会需要进行手机号或者邮箱进行认证)   点击我已阅读  点击【管理您的数据】  找到小米运动健康,点击下载图标  等待60秒,点击【确定】  速度可能不是很快,根据数据量决定的。最后会发送到你的邮箱中。 接收到邮件后,点击下载,注意:上面包含着压缩包密码   ## 解析数据 文件压缩包中存在`MiFitness_data_copy_guide.pdf`文件,这里说明了表结构和含义,可以进行对照。 通过csv查看器打开xxxx_xxxx_MiFitness_hlth_center_fitness_data文件(数据太多的话,excel打不开)  关注到C列heart_rate字段,其中E列是一个json格式,接下来考虑如何去筛选提取了。 这里使用python进行解析。 > 需要python3.x版本 > 需要pandas库(当然也可以通过传统的文本解析和IF进行处理) > 需要sqlite3库(这里我给导出成sqlite了,不需要可以不进行处理) ```python import datetime import pandas import os import json import sqlite3 DB_FILE = "backup.db" def run(): file = r"./20250803_xxxxxxxx_MiFitness_hlth_center_fitness_data.csv" csv = pandas.read_csv(file) csv = csv[csv['Key'] == 'heart_rate'] # 先提取heart_rate数据 csv.reset_index(drop=True, inplace=True) # 因为清洗到没用的数据了,所以需要重置一下索引 if not os.path.exists(DB_FILE): with sqlite3.connect(DB_FILE) as conn: conn.execute(""" CREATE TABLE heart_rate ( timestamp TEXT, bpm INTEGER ) """) # 创建表结构 value_ = csv["Value"] with sqlite3.connect(DB_FILE) as conn: for i in range(len(value_)): print(i, len(value_)) i_ = value_[i] loads = json.loads(i_) timestamp = datetime.datetime.fromtimestamp(loads['time']).strftime("%Y-%m-%dT%H:%M:%S.%f") hr = loads['bpm'] conn.execute("INSERT INTO heart_rate (timestamp, bpm) VALUES (?, ?)", (timestamp, hr)) # 插入到sqlite中 当然可以进行插入优化,提高插入速度,这里就不写了。 run() ``` 查看结果  # 数据分析 接下来可以使用其它工具进行数据分析了。  近期的S4手表更新支持心率广播了,这样就可以实时监测,并且展示到其它设备上了。(细节就不进行展示了) # 导出方案 其实如果小米手机,可以通过备份来导出,备份小米运动健康,然后复制到电脑上,用7zip打开,找到`apps\com.mi.health\db\【小米账号】\cn\fitness_data`,其中hr_record表就是你想要的数据。 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏