引言
最近开始关注健康了,小米设备用了好几年了,从小米手环2到小米手表S4,见证了科技的发展和可穿戴设备普及,但是每次查看健康数据要从指定的APP中查看,并且不能自定义的去分析数据(比如每日对比,同期比较等),虽然这东西没啥用吧,但是数据在自己手,无论是使用python,还是excel,都是可以按照自己希望的方式去展示想看的内容的。
数据导出
这是非侵入式,简单易操作的方法进行数据导出,如果有root,应该更简单了吧(手头没有设备/模拟器,暂时无法测试。)
- 需要一台联网的设备,手机电脑都可以
首先登录小米账号: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了,不需要可以不进行处理)
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表就是你想要的数据。



可以先从网站上下载下来副本,有一个PDF文件有表结构说明(MiFitness_data_copy_guide.pdf),时间太久了,我这里找不到了。