Appleのヘルスケアアプリのデータを使って、他のアプリでグラフを描こうと思ったが、エクスポートされるデータはXMLのため、そのままでは扱いにくい。

このため、XMLファイルから体重データを抜き出してCSVを出力するRubyスクリプトを書いた。

require 'nokogiri'
require 'date'
 
reader = Nokogiri::XML::Reader File.read('export.xml')
data = []
 
reader.each do |node|
  if node.name == 'Record' && node.attributes['type'] == 'HKQuantityTypeIdentifierBodyMass'
    d = Date.parse(node.attributes['startDate']).strftime("%Y-%m-%d")
    data << [d, node.attributes['value']]
  end   
end
data.sort.each {|d|
  puts d.join(',')
}
 
=begin
<Record type="HKQuantityTypeIdentifierBodyMass" sourceName="1byone Health" sourceVersion="63" device="&lt;&lt;HKDevice: 0x3013e9b30&gt;, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone, firmware:iPhone, software:17.5.1, localIdentifier:ja_JP, UDIDeviceIdentifier:ja_JP, creation date:2024-06-02 22:17:36 +0000&gt;" unit="kg" creationDate="2024-06-17 07:17:17 +0900" startDate="2024-06-17 07:17:17 +0900" endDate="2024-06-17 07:17:17 +0900" value="71.9"/>
=end

以下、ChatGPTにヘルスケアデータの構造を聞いた回答

Appleのヘルスケアアプリでエクスポートされるデータは、XML (Extensible Markup Language) フォーマットで提供されます。このフォーマットは、ヘルスデータを構造化して格納するための標準的な形式です。

データの構造と内容

  1. XMLヘッダー エクスポートされたファイルは、XMLヘッダーから始まります。

    <?xml version="1.0" encoding="UTF-8"?>
  2. 全体のルート要素 データ全体は <HealthData> というルート要素でラップされています。

    <HealthData locale="en_US">
        ...
    </HealthData>
  3. データの各エントリー ヘルスケアのデータは、それぞれの記録を <Record> 要素として格納します。主な属性は以下の通りです:

    • type: データの種類(例: 歩数、心拍数など)。
    • sourceName: データのソース名(iPhone、Apple Watchなど)。
    • sourceVersion: ソースのバージョン情報。
    • unit: データの単位(例: count, bpm, kcal など)。
    • creationDate: データが作成された日時。
    • startDate: データの開始日時(測定期間の開始)。
    • endDate: データの終了日時(測定期間の終了)。
    • value: データの値(例: 歩数の数値、体重の値など)。

    例:

    <Record type="HKQuantityTypeIdentifierStepCount" 
            sourceName="iPhone" 
            sourceVersion="16.2" 
            unit="count" 
            creationDate="2024-12-10 07:30:00 +0000" 
            startDate="2024-12-10 07:00:00 +0000" 
            endDate="2024-12-10 07:05:00 +0000" 
            value="1200"/>
  4. ワークアウトデータ ワークアウトデータは <Workout> 要素で表されます。これには以下の属性が含まれます:

    • workoutActivityType: ワークアウトの種類(例: ランニング、サイクリングなど)。
    • duration: ワークアウトの継続時間。
    • totalDistance: 総移動距離。
    • totalEnergyBurned: 総消費カロリー。
    • startDate: ワークアウト開始日時。
    • endDate: ワークアウト終了日時。

    例:

    <Workout workoutActivityType="HKWorkoutActivityTypeRunning" 
             duration="1800" 
             totalDistance="5.0" 
             totalEnergyBurned="300" 
             startDate="2024-12-10 06:30:00 +0000" 
             endDate="2024-12-10 07:00:00 +0000" />
  5. メタデータ 各エントリーには <MetadataEntry> 要素が付属している場合があります。この要素には、追加情報がキー・バリュー形式で格納されます。

    例: 1

    <MetadataEntry key="HKMetadataKeyHeartRateMotionContext" value="1"/>
  6. ファイルの最後 エクスポートされたデータの最後には、ヘルスデータの概要を示す <ExportDate> 要素が含まれます。

    <ExportDate value="2024-12-11 08:00:00 +0000"/>

主なデータ種類と識別子

  • 歩数: HKQuantityTypeIdentifierStepCount
  • 心拍数: HKQuantityTypeIdentifierHeartRate
  • 体重: HKQuantityTypeIdentifierBodyMass
  • 睡眠分析: HKCategoryTypeIdentifierSleepAnalysis

使用例と注意点

  • データ解析: このXMLファイルを解析するには、プログラミング言語(例: Python, JavaScript, R)や専用ツールを使用します。
  • プライバシー: エクスポートされたデータには個人情報が含まれるため、取り扱いには注意が必要です。
  • データ量: データが大量になる場合があるので、解析時にはパフォーマンスを考慮してください。

これがAppleのヘルスケアアプリでエクスポートされるデータのフォーマットの概要です。