Palo Alto Health Labs
Resource · Data labeling

EEG, Sleep and Wearable Data Formats for Annotation: EDF/EDF+, BDF, BIDS-EEG, WFDB and What to Send a Labeling Team

What each common physiological data format stores, where annotations live, which header fields carry identifiers, and how to package recordings for a labeling team.

Format
Guide
Read time
7 min
Sources
12 spec and peer-reviewed
Updated
Oct 27, 2026

Which file format stores what?

Most clinical EEG and sleep recordings move between teams as EDF or EDF+. The EDF specification says "one data file contains one uninterrupted digitized polygraphic recording," and EDF+ was created because "EDF can only handle uninterrupted recordings." Research datasets increasingly arrive organized as BIDS-EEG, cardiology and physiology archives often use PhysioNet's WFDB format, and consumer wearables usually export CSV or Parquet. The format decides where the labels go, how much metadata survives, and what has to be scrubbed before files leave your site.

FormatWhat it storesAnnotation supportCommon toolsPHI risk in headers
EDFOne uninterrupted recording; samples as 16-bit (2-byte) integers with per-signal label, physical units and min/maxNone built in (store events separately)MNE-Python, EDFbrowserHigh: 80-character patient and recording ID fields, start date and time
EDF+Like EDF, but can hold several non-contiguous recordings in one fileYes: an “EDF Annotations” signal of time-stamped annotation lists; can be annotations onlyMNE-Python, EDFbrowserHigh: patient ID field is defined to hold hospital code, sex, birthdate and name
BDFA 24-bit version of EDFNot in the base format (BIDS permits BDF+)MNE-Python, EDFbrowserSame header fields as EDF
BIDS-EEGA folder and naming standard around EDF, BrainVision, EEGLAB or BDF files, plus metadata sidecarsEvents in _events.tsv / _events.json filesMNE-Python (MNE-BIDS)Depends on the underlying data files and the participant files
WFDB (PhysioNet)A record: a .hea header naming the signal files, plus signal files in several formatsSeparate annotation files per annotator (e.g., .atr for reference annotations)WFDB tools in C, MATLAB and PythonCheck the header and any info lines before sharing (our view)
NWBA data standard for neurophysiology; HDF5 is its primary storage backendSupported within the file (our summary)NWB ecosystem toolsCheck subject and session metadata (our view)
DICOM waveformWaveform objects in the DICOM standard, including ECG and routine scalp EEG storage classesVia the DICOM object model (our summary)DICOM toolkitsDICOM patient attributes travel with the object (our view)
CSV / Parquet exportsVendor or in-house tables of timestamps and values; no single spec ownerWhatever columns the exporter wrotepandas, Arrow, spreadsheetsDevice IDs, user IDs and file names often carry identifiers (our view)

Sources: EDF specification; Kemp et al. 1992; EDF+ specification; Kemp & Olivan 2003; BioSemi BDF format; BIDS EEG specification; Pernet et al. 2019 (EEG-BIDS); PhysioNet WFDB; Goldberger et al. 2000; Rübel et al. 2022 (NWB); DICOM PS3.4 Annex B.5; tools: MNE-Python, EDFbrowser, wfdb.io. Cells marked "our view" or "our summary" are editorial; CSV/Parquet has no spec owner and is described generically.

EDF vs. EDF+: what changed?

The EDF+ specification says "EDF+ allows storage of several NON-CONTIGUOUS recordings into one file. This is the only incompatibility with EDF." It also adds annotations: they live in an "EDF Annotations" signal as time-stamped annotation lists, and "EDF+ can also store events and annotations only, without any signals." That last point matters for labeling: a team can return its labels as a small annotation-only EDF+ file that lines up with your original recording. BDF, from BioSemi, is "a 24 bit version of the popular 16 bit EDF format," for amplifiers whose resolution does not fit in 16 bits.

Sources: EDF+ specification; Kemp & Olivan 2003; BioSemi BDF format.

What does BIDS-EEG require?

BIDS is a way of organizing files, not a new signal format. The EEG specification says "EEG data MUST be stored in one of the following formats": European data format (.edf, with "edf+ files are permitted"), BrainVision (.vhdr/.vmrk/.eeg), EEGLAB (.set/.fdt) or Biosemi (.bdf). It recommends "the European data format, or the BrainVision data format," and adds that "the capital .EDF extension MUST NOT be used." Event timing goes in _events.tsv files; in the specification's words, "specific onsets can be specified in the events.tsv file."

Sources: BIDS EEG specification; Pernet et al. 2019 (EEG-BIDS).

How do WFDB records and annotations work?

In PhysioNet's WFDB format, a record is a set of files sharing one name. The WFDB guide says "a header file specifies the names of the associated signal files and their attributes," and "WFDB signal files exist in several formats." Annotations sit in separate files named by annotator: "the special annotator name 'atr' is used to name the set of reference annotations supplied by the database developers." Because each annotator gets its own file, WFDB handles multiple raters cleanly, which helps when you later measure inter-rater agreement.

Sources: PhysioNet WFDB; Goldberger et al. 2000.

Header PHI checklist

EDF headers are where identifiers hide. The EDF header has 80 characters for "local patient identification" and 80 for "local recording identification," plus a start date and time. EDF+ defines the patient ID field to start with the hospital code, sex, birthdate and the patient's name, and says unknown or anonymized subfields are replaced by "X". The recording ID holds the start date, the EEG/PSG number, a technician code and an equipment code. Before files go to any outside team, in our view you should:

Sources: EDF specification; EDF+ specification. The checklist itself is our practice recommendation.

What to send a labeling team

In our view, a labeling team can start fast when it gets: de-identified recordings in one format (EDF+ or BIDS-EEG for EEG and sleep, WFDB for ECG-style archives); a channel list with montage, sampling rate and units; any existing events as annotation-only files or _events.tsv, not burned into file names; the labeling guideline with examples of edge cases; and the label output format you want back (EDF+ annotations, BIDS events, WFDB annotator files or a CSV with onset, duration and label). Agree on one time reference, recording start or UTC, before anyone labels.

This section is our practice recommendation, not a quoted standard.

Related resources

Frequently asked questions

What is the difference between EDF and EDF+?

EDF holds one uninterrupted recording. EDF+ can hold several non-contiguous recordings in one file, which its specification calls the only incompatibility with EDF, and adds an EDF Annotations signal for time-stamped events. EDF+ files can even hold annotations without any signals.

Is an EDF file de-identified by default?

No. The EDF header has an 80-character patient identification field and a start date and time, and EDF+ defines the patient field to hold hospital code, sex, birthdate and name. Replace those subfields with X or a study code and check annotation text before sharing.

Which formats does BIDS-EEG accept?

The BIDS EEG specification requires EEG data in European data format (.edf, EDF+ permitted), BrainVision, EEGLAB or Biosemi .bdf, and recommends EDF or BrainVision. Events go in _events.tsv files.

How should a labeling team return EEG labels?

Agree on it up front. Common choices are an annotation-only EDF+ file, BIDS _events.tsv files, WFDB annotator files, or a CSV with onset, duration and label, all on one agreed time reference.

Scope it in 30 minutes

Book a scoping call and we'll name the smallest engagement that moves you forward. Most teams start with the fixed-scope Initial Audit.

Book a 30-min scoping call

Prefer to write? Send a short note.