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.
| Format | What it stores | Annotation support | Common tools | PHI risk in headers |
|---|---|---|---|---|
| EDF | One uninterrupted recording; samples as 16-bit (2-byte) integers with per-signal label, physical units and min/max | None built in (store events separately) | MNE-Python, EDFbrowser | High: 80-character patient and recording ID fields, start date and time |
| EDF+ | Like EDF, but can hold several non-contiguous recordings in one file | Yes: an “EDF Annotations” signal of time-stamped annotation lists; can be annotations only | MNE-Python, EDFbrowser | High: patient ID field is defined to hold hospital code, sex, birthdate and name |
| BDF | A 24-bit version of EDF | Not in the base format (BIDS permits BDF+) | MNE-Python, EDFbrowser | Same header fields as EDF |
| BIDS-EEG | A folder and naming standard around EDF, BrainVision, EEGLAB or BDF files, plus metadata sidecars | Events in _events.tsv / _events.json files | MNE-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 formats | Separate annotation files per annotator (e.g., .atr for reference annotations) | WFDB tools in C, MATLAB and Python | Check the header and any info lines before sharing (our view) |
| NWB | A data standard for neurophysiology; HDF5 is its primary storage backend | Supported within the file (our summary) | NWB ecosystem tools | Check subject and session metadata (our view) |
| DICOM waveform | Waveform objects in the DICOM standard, including ECG and routine scalp EEG storage classes | Via the DICOM object model (our summary) | DICOM toolkits | DICOM patient attributes travel with the object (our view) |
| CSV / Parquet exports | Vendor or in-house tables of timestamps and values; no single spec owner | Whatever columns the exporter wrote | pandas, Arrow, spreadsheets | Device 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:
- Replace the patient ID subfields with "X" or a study code, and check the recording ID for EEG/PSG numbers and technician codes.
- Decide how to handle the start date and time; EDF+ says the start time "should be local time at the patient's location," so it is a real date and place clue.
- Read every annotation text, not just the header: technicians sometimes type names or notes into free-text events.
- Rename files that carry MRNs, names or dates, and check BIDS participant files, WFDB header info lines and CSV columns the same way.
- Keep the re-identification key at your site, and put the transfer under the right agreement (a BAA or data use agreement) when the data is PHI.
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 callPrefer to write? Send a short note.