# When the world falls asleep, wakes up, and how long it sleeps

> Mean sleep onset, wake time and total sleep for 35 countries, measured by the Oura Ring over 50 million nights in 2021 (Willoughby et al. 2023).

- Source: [Willoughby et al. (2023), Sleep Medicine](https://doi.org/10.31234/osf.io/8ahsu)
- Citation: Willoughby AR, Alikhani I, Karsikas M, Chua XY, Chee MWL. Country differences in nocturnal sleep variability: Observations from a large-scale, long-term sleep wearable study. Sleep Medicine. 2023;110:155–165. doi:10.1016/j.sleep.2023.08.010. Numbers taken from the CC BY 4.0 preprint, PsyArXiv doi:10.31234/osf.io/8ahsu (OSF file version 6, 2023-08-17), Supplementary Tables S1 and S2a–S2e.
- Sample: 226,187 Oura Ring users in 35 countries, 54,769,523 nights (mean 242 nights per user)
- Coverage: 35 countries, nights from 4 January 2021 to 2 January 2022
- License: Preprint licensed CC BY 4.0 (OSF record https://osf.io/preprints/psyarxiv/8ahsu_v1/, https://creativecommons.org/licenses/by/4.0/). Values are reproduced from its supplementary tables with attribution; no changes other than unit conversions.
- Retrieved: 2026-10-14
- JSON (all tables): https://karelbusta.dev/data/sleep/datasets/sleep-timing-by-country.json
- CSV, Sleep timing and duration by country (Oura Ring users, 2021) (35 rows): https://karelbusta.dev/data/sleep/datasets/sleep-timing-by-country/countries.csv

## Tables

### Sleep timing and duration by country (Oura Ring users, 2021)

One row per country (35). Mean sleep onset, wake time, mid-sleep and total sleep time measured by the Oura Ring, Jan 2021–Jan 2022, as tabulated in Willoughby et al. (2023) Supplementary Tables S1, S2a–S2e. Weekday = Sunday–Thursday nights except UAE.

| Column | Type | Unit | Description |
| --- | --- | --- | --- |
| country | string |  | Country of residence as named in the source. |
| region | string |  | Global region as grouped in Table S1. |
| users_band | string |  | Band for the mean number of users per week contributing data (Table S1). Oura did not allow exact counts to be published. |
| users_min | number | users | Lower bound of the band. |
| users_max | number | users | Upper bound of the band; null for '>50,000' (USA). |
| mean_nights | number | nights | Mean number of nights of data per user (Table S1). |
| mean_age | number | years | Mean user age (Table S1). |
| male_pct | number | % | Proportion of male users (Table S1). |
| sleep_onset_weekday | string |  | Mean weekday sleep onset time, local clock, rounded to the minute (Table S2a, SOTwd). Sleep onset is when the ring detects sleep, not when the user went to bed. |
| sleep_onset_weekday_min | number | min | Minutes relative to midnight, negative = before midnight (e.g. 23:30 = -30, 00:30 = 30). Exact conversion of the tabulated hh:mm:ss, rounded to 0.01 min. |
| wake_weekday | string |  | Mean weekday wake time, local clock, rounded to the minute (Table S2a, WTwd). |
| wake_weekday_min | number | min | Minutes after midnight (Table S2a, WTwd), rounded to 0.01 min. |
| midsleep_weekday | string |  | Mean weekday mid-sleep time, rounded to the minute (Table S2a, MSTwd). |
| midsleep_weekday_min | number | min | Minutes after midnight (Table S2a, MSTwd), rounded to 0.01 min. |
| sleep_weekday_h | number | h | Mean weekday total sleep time (TST, Table S2c) / 60, rounded to 0.01 h. Time actually asleep, excluding sleep latency and wake after sleep onset. |
| sleep_weekday_min | number | min | Mean weekday total sleep time as tabulated (Table S2c, TSTwd). |
| sleep_weekday_display | string |  | TSTwd rounded to the minute. |
| sleep_efficiency_weekday | number | % | Mean weekday TST / time in bed x 100 (Table S2c, SEwd). |
| sleep_onset_weekend | string |  | Mean weekend sleep onset time, rounded to the minute (Table S2b, SOTwe). |
| sleep_onset_weekend_min | number | min | Minutes relative to midnight, negative = before midnight (e.g. 23:30 = -30, 00:30 = 30). Exact conversion of the tabulated hh:mm:ss, rounded to 0.01 min. |
| wake_weekend | string |  | Mean weekend wake time, rounded to the minute (Table S2b, WTwe). |
| wake_weekend_min | number | min | Minutes after midnight (Table S2b, WTwe), rounded to 0.01 min. |
| sleep_weekend_h | number | h | Mean weekend total sleep time (Table S2d, TSTwe) / 60, rounded to 0.01 h. |
| sleep_weekend_min | number | min | Mean weekend total sleep time as tabulated (Table S2d, TSTwe). |
| sleep_weekend_display | string |  | TSTwe rounded to the minute. |
| weekend_extension_min | number | min | Mean per-user weekend minus weekday TST (Table S2e, TSTdiff). |
| social_jetlag_min | number | min | Mean per-user weekend minus weekday mid-sleep (Table S2e, MSTdiff). |

## Caveats

- Oura Ring owners are a self-selected, affluent, mostly working-age group (mean age 44, 60% male), not a representative sample of any country.
- Group sizes differ a lot, from 200–500 average weekly users (e.g. India, South Africa, UAE) to more than 50,000 (USA); Oura did not allow exact counts per country to be published.
- Sleep onset is when the ring's algorithm detects sleep, not bedtime; total sleep excludes time awake in bed, so it is shorter than self-reported "hours of sleep".
- [object Object]
- Country groups differ in age and sex mix (e.g. Japan 37 years and 79% male, Finland 44 years and 52% male); the tabulated means are not adjusted for this.
- 2021 was a COVID-19 pandemic year with lockdowns and remote work in many countries, which shifted sleep timing.
- Figures in the paper's main text (e.g. a sleep-efficiency range of 84.16–87.37%) are model estimates and differ from the tabulated means used here (83.36–86.81%).
- Values come from the preprint's supplementary tables; the published Sleep Medicine version could not be accessed to confirm the tables are unchanged (its abstract matches).

## Methodology

## What was measured

Willoughby et al. analysed one year of data (Monday 4 January 2021 to Sunday 2 January 2022) from 226,187 users of
the 2nd-generation Oura Ring, a consumer sleep wearable that infers sleep from motion, heart rate variability and
skin temperature. Users consented to research use of anonymised data; each contributed at least 90 nights (mean
242), and periods of travel across time zones were excluded. For each night the longest sleep episode with at least
3 hours in bed was used.

Measures were averaged per user per week, separately for weekday nights (a week counted only with at least 4 of 5
work nights) and weekend nights (both nights required; Friday and Saturday nights, Thursday and Friday in the UAE),
then averaged over the year per user. Every country averaged at least 200 users per week. The supplementary tables
report, per country, the mean (SD) across users of:

- **Sleep onset time (SOT)**, **wake time (WT)** and **mid-sleep (MST)**, in local clock time (Tables S2a weekday, S2b weekend)
- **Total sleep time (TST)**, sleep onset latency, sleep efficiency and wake after sleep onset (Tables S2c, S2d)
- weekend-minus-weekday differences, including weekend sleep extension (TST) and social jetlag (MST) (Table S2e)
- the band of average weekly users, mean nights per user, mean age and % male (Table S1)

## How this repo processed it

The 70-page preprint PDF is pinned by OSF file version and sha256 in `ingest/sleep-timing-by-country/manifest.json`.
Because it is larger than 900 KB, only the text layer of the six table pages (PDF pages 30 and 32–36) is committed,
extracted with macOS PDFKit (`extract-pages.swift`, no OCR); `fetch.ts` re-extracts it from the downloaded PDF and
requires a byte-identical result. `build.ts` parses those tables and:

- keeps every number as tabulated, converting clock times to minutes relative to midnight (negative = before
  midnight, so 23:30 is -30) and TST minutes to hours (/60, two decimals); display strings are rounded to the minute
- turns the user bands into lower/upper bounds using the table footnote (200+ means 200–500, and so on)
- fails unless all tables list the same 35 countries, each mid-sleep is within 5 minutes of the onset/wake midpoint
  (largest gap: 0.2 min), and the weekend-minus-weekday differences recomputed from Tables S2a–S2d match Table S2e
  within 1 minute (largest gap: 0.02 min)

Not used: Walch, Cochran & Forger (2016, *Science Advances*, ENTRAIN app) show country bedtimes, wake times and sleep
durations only in figures, and their supplement holds only regression tables, so their numbers can't be traced to a table.

## Built from this dataset

- Ranking: [Which countries go to bed the latest?](https://karelbusta.dev/data/sleep/countries-that-go-to-bed-latest)
- Ranking: [Which countries sleep the least?](https://karelbusta.dev/data/sleep/countries-that-sleep-the-least)
