You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Google Fit REST API响应中提取并区分收缩压与舒张压?

解析Google Fit血压聚合响应:区分收缩压与舒张压

首先要明确:你当前拿到的是聚合后的血压汇总数据(数据源ID是derived:com.google.blood_pressure.summary:...),这类响应返回的是指定时间范围内血压的统计值(平均、最大、最小),而非原始的单个血压条目。

汇总数据的Value字段对应关系

com.google.blood_pressure.summary类型的value数组索引是固定的,对应含义如下:

  • 索引0:收缩压平均值
  • 索引1:收缩压最大值
  • 索引2:收缩压最小值
  • 索引3:舒张压平均值
  • 索引4:舒张压最大值
  • 索引5:舒张压最小值
  • 索引6:心率平均值(可选,无数据则为空)
  • 索引7:心率最大值(可选,无数据则为空)

结合你的响应和Google Fit里的两个条目(120/80、121/89):

  • 收缩压的最大值是121(索引1的fpVal)、最小值是120(索引2的fpVal)
  • 舒张压的最大值是89(索引4的fpVal)、最小值是80(索引5的fpVal)
    这正好对应你在App里看到的两个原始读数的极值。

代码示例(JavaScript)

// 假设apiResponse是你收到的完整响应对象
const parseBloodPressureSummary = (apiResponse) => {
  const buckets = apiResponse.bucket || [];
  const result = [];

  buckets.forEach(bucket => {
    bucket.dataset.forEach(dataset => {
      dataset.point.forEach(point => {
        if (point.dataTypeName === 'com.google.blood_pressure.summary') {
          const values = point.value;
          const bloodPressureStats = {
            startTime: new Date(parseInt(point.startTimeNanos) / 1000000),
            endTime: new Date(parseInt(point.endTimeNanos) / 1000000),
            systolic: {
              average: values[0]?.fpVal,
              max: values[1]?.fpVal,
              min: values[2]?.fpVal
            },
            diastolic: {
              average: values[3]?.fpVal,
              max: values[4]?.fpVal,
              min: values[5]?.fpVal
            }
          };
          result.push(bloodPressureStats);
        }
      });
    });
  });

  return result;
};

// 使用示例
const stats = parseBloodPressureSummary(apiResponse);
console.log('收缩压极值:', `${stats[0].systolic.min}/${stats[0].diastolic.min}`, `${stats[0].systolic.max}/${stats[0].diastolic.max}`);

代码示例(Python)

from datetime import datetime

def parse_blood_pressure_summary(api_response):
    result = []
    buckets = api_response.get('bucket', [])
    for bucket in buckets:
        for dataset in bucket.get('dataset', []):
            for point in dataset.get('point', []):
                if point.get('dataTypeName') == 'com.google.blood_pressure.summary':
                    values = point.get('value', [])
                    blood_pressure_stats = {
                        'start_time': datetime.fromtimestamp(int(point['startTimeNanos']) / 1e9),
                        'end_time': datetime.fromtimestamp(int(point['endTimeNanos']) / 1e9),
                        'systolic': {
                            'average': values[0].get('fpVal') if len(values) > 0 else None,
                            'max': values[1].get('fpVal') if len(values) > 1 else None,
                            'min': values[2].get('fpVal') if len(values) > 2 else None
                        },
                        'diastolic': {
                            'average': values[3].get('fpVal') if len(values) > 3 else None,
                            'max': values[4].get('fpVal') if len(values) > 4 else None,
                            'min': values[5].get('fpVal') if len(values) > 5 else None
                        }
                    }
                    result.append(blood_pressure_stats)
    return result

# 使用示例
stats = parse_blood_pressure_summary(api_response)
print(f"收缩压极值: {stats[0]['systolic']['min']}/{stats[0]['diastolic']['min']}, {stats[0]['systolic']['max']}/{stats[0]['diastolic']['max']}")

获取原始单个血压条目

如果你需要直接拿到每个单独的血压读数(比如120/80、121/89这样的成对数据),建议调用dataset:aggregate时指定原始数据源:

  • 请求体中设置dataSourceId为raw:com.google.blood_pressure(或对应的用户输入数据源raw:com.google.blood_pressure:com.google.android.apps.fitness:user_input)
  • 这类响应的每个point对应一个原始读数,value数组的索引0是收缩压,索引1是舒张压。

内容的提问来源于stack exchange,提问作者abhinav mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:24:56