Atlas lets you explore your Apple Health data.
Install Atlas using pip
:
pip install atlas-db
Upgrade Atlas using pip
:
pip install atlas-db --upgrade
Uninstall Expanse (old name) using pipx
:
pipx uninstall expanse
First we create the .parquet
file from the export.xml
file.
atlas parquet export.xml -o ah.parquet
We can explore the data in many ways.
It is just a table/dataframe/parquet file with 5 columns.
But here we'll use clickhouse local
:
clickhouse local
Let's take a look at the table.
DESCRIBE TABLE `ah.parquet`
ββnameβββββ¬βtypeβββββββββββββββββββββ¬βdefault_typeββ¬βdefault_expressionββ¬βcommentββ¬βcodec_expressionββ¬βttl_expressionββ
β type β Nullable(String) β β β β β β
β start β Nullable(DateTime64(6)) β β β β β β
β end β Nullable(DateTime64(6)) β β β β β β
β created β Nullable(DateTime64(6)) β β β β β β
β value β Nullable(String) β β β β β β
βββββββββββ΄ββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββ΄ββββββββββ΄βββββββββββββββββββ΄βββββββββββββββββ
What kind of "types" do we have and how many?
SELECT
type,
COUNT(*) AS count
FROM `ah.parquet`
GROUP BY type
ORDER BY count DESC
ββtypeββββββββββββββββββββββββββββ¬ββcountββ
β ActiveEnergyBurned β 879902 β
β HeartRate β 451854 β
β BasalEnergyBurned β 289031 β
β DistanceWalkingRunning β 260500 β
β StepCount β 217384 β
β PhysicalEffort β 69747 β
β AppleExerciseTime β 61363 β
β AppleStandTime β 58309 β
β EnvironmentalAudioExposure β 44535 β
β SleepAnalysis β 36599 β
β WalkingStepLength β 28281 β
β WalkingSpeed β 28281 β
β RespiratoryRate β 27829 β
β AppleStandHour β 25877 β
β FlightsClimbed β 22690 β
β WalkingDoubleSupportPercentage β 21900 β
β WalkingAsymmetryPercentage β 13820 β
β HeartRateVariabilitySDNN β 11961 β
β OxygenSaturation β 4912 β
β StairDescentSpeed β 4718 β
β StairAscentSpeed β 4249 β
β DistanceCycling β 2890 β
β TimeInDaylight β 2403 β
β HeadphoneAudioExposure β 2323 β
β RestingHeartRate β 1399 β
β WalkingHeartRateAverage β 1176 β
β DistanceSwimming β 455 β
β SwimmingStrokeCount β 455 β
β AppleSleepingWristTemperature β 442 β
β RunningSpeed β 391 β
β VO2Max β 366 β
β RunningPower β 173 β
β DietaryCaffeine β 171 β
β AppleWalkingSteadiness β 138 β
β SixMinuteWalkTestDistance β 122 β
β HeartRateRecoveryOneMinute β 76 β
β RunningVerticalOscillation β 74 β
β RunningGroundContactTime β 67 β
β RunningStrideLength β 54 β
β MindfulSession β 34 β
β HighHeartRateEvent β 18 β
β AudioExposureEvent β 14 β
β BodyMass β 14 β
β Height β 5 β
β Fatigue β 1 β
β HKDataTypeSleepDurationGoal β 1 β
ββββββββββββββββββββββββββββββββββ΄βββββββββ
What's our total step count?
Note
The value
column is type Nullable(String)
so we have to cast toFloat64
to sum up the step values.
SELECT sum(toFloat64(value))
FROM `ah.parquet`
WHERE type = 'StepCount'
ββsum(toFloat64(value))ββ
β 30295811 β
βββββββββββββββββββββββββ
30.295.811 (30.29 million) steps. That's a lot of steps!
- open the Apple Health app on iOS
- tap on your profile picture (or initials) at the top right
- tap on Export All Health Data
- tap on Export
- wait a few seconds to a few minutes (~3min for 10 years of data)
- get the export.zip archive via Airdrop to a Mac (or save to Files)
Note
The export.xml file is in the export.zip archive.
You can expand the export.zip file by double-clicking on it.
This creates a directory named apple_health_export and in it is the export.xml file.
![](https://private-user-images.githubusercontent.com/14825/326262872-c519f3e9-23bf-4f90-909f-30a07b286d57.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTQ5NDE4NDEsIm5iZiI6MTcxNDk0MTU0MSwicGF0aCI6Ii8xNDgyNS8zMjYyNjI4NzItYzUxOWYzZTktMjNiZi00ZjkwLTkwOWYtMzBhMDdiMjg2ZDU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA1MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNTA1VDIwMzkwMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUwZGI2YmU3ZGEyNmU4MDcyNDliMWM0MmI0NjBmNDRkZGY0MDA0MDRkNTE0YWI0MThlNTcxMTUwMzk3OTg3NWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.ioYNa9SWC4B8YoePlROCOvAB03J6CMgKWy8TTQ5RG88)
![](https://private-user-images.githubusercontent.com/14825/326262881-64409b40-c87f-4bbc-9df8-778d758517fc.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTQ5NDE4NDEsIm5iZiI6MTcxNDk0MTU0MSwicGF0aCI6Ii8xNDgyNS8zMjYyNjI4ODEtNjQ0MDliNDAtYzg3Zi00YmJjLTlkZjgtNzc4ZDc1ODUxN2ZjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA1MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNTA1VDIwMzkwMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFlNGIzZTgyZTg3NDhkZTQwMDJkYWFlZGJkNTlkNzlmOTE4Zjc2MzczZmE4NDEyZjRlMmYxZTUxMmY0NTllNzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.yIEVi7EOYi-fN8RDrDjV61UOtXpuwZ7OPNy5eISxjnY)
![](https://private-user-images.githubusercontent.com/14825/326262894-0f83fc2d-6728-4023-8074-75517a2af49f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTQ5NDE4NDEsIm5iZiI6MTcxNDk0MTU0MSwicGF0aCI6Ii8xNDgyNS8zMjYyNjI4OTQtMGY4M2ZjMmQtNjcyOC00MDIzLTgwNzQtNzU1MTdhMmFmNDlmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA1MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNTA1VDIwMzkwMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ2NmJmODEyY2I5MzQzNWFmY2QxNWI2ZWQzODY4MjBlN2FkN2JhOGNlYWVhZWU4YzIyZWI5ZTA0NzIzMWMzY2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.lJVSEqD5ROBsg9KX4nUJ-1wvYQA-hkocm-3bnToy_m0)
![](https://private-user-images.githubusercontent.com/14825/326262904-35e9d36e-9a7a-46aa-b6da-1420d05b1f20.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTQ5NDE4NDEsIm5iZiI6MTcxNDk0MTU0MSwicGF0aCI6Ii8xNDgyNS8zMjYyNjI5MDQtMzVlOWQzNmUtOWE3YS00NmFhLWI2ZGEtMTQyMGQwNWIxZjIwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA1MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNTA1VDIwMzkwMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYxOTY3ZDlkOTNhNTgyZWQwZDYwNDI0OGZjYzlhYjRkYWVjMmM1NDMxMjZlZjZiYTc0YjczOWFiMWM1ZTQ1YjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.8DiLCW9pc9Yeefw4EAkiPCkTvo9l5LjBxu8kQvjtthw)
See: Apple Support on how to export Apple Health and Fitness in XML format
atlas parquet export.xml
- turn export.xml into a simple parquet file