wfdb

These core components are accessible by importing the wfdb package directly, as well as from their respective subpackages.

WFDB Records

wfdb.rdheader(record_name, pn_dir=None, rd_segments=False)

Read a WFDB header file and return a Record or MultiRecord object with the record descriptors as attributes.

Parameters
record_namestr

The name of the WFDB record to be read, without any file extensions. If the argument contains any path delimiter characters, the argument will be interpreted as PATH/BASE_RECORD. Both relative and absolute paths are accepted. If the pn_dir parameter is set, this parameter should contain just the base record name, and the files fill be searched for remotely. Otherwise, the data files will be searched for in the local path.

pn_dirstr, optional

Option used to stream data from Physionet. The Physionet database directory from which to find the required record files. eg. For record ‘100’ in ‘http://physionet.org/content/mitdb’ pn_dir=’mitdb’.

rd_segmentsbool, optional

Used when reading multi-segment headers. If True, segment headers will also be read (into the record object’s segments field).

Returns
recordRecord or MultiRecord

The WFDB Record or MultiRecord object representing the contents of the header read.

Examples

>>> ecg_record = wfdb.rdheader('100', pn_dir='mitdb')
wfdb.rdrecord(record_name, sampfrom=0, sampto=None, channels=None, physical=True, pn_dir=None, m2s=True, smooth_frames=True, ignore_skew=False, return_res=64, force_channels=True, channel_names=None, warn_empty=False)

Read a WFDB record and return the signal and record descriptors as attributes in a Record or MultiRecord object.

Parameters
record_namestr

The name of the WFDB record to be read, without any file extensions. If the argument contains any path delimiter characters, the argument will be interpreted as PATH/BASE_RECORD. Both relative and absolute paths are accepted. If the pn_dir parameter is set, this parameter should contain just the base record name, and the files fill be searched for remotely. Otherwise, the data files will be searched for in the local path.

sampfromint, optional

The starting sample number to read for all channels.

samptoint, ‘end’, optional

The sample number at which to stop reading for all channels. Reads the entire duration by default.

channelslist, optional

List of integer indices specifying the channels to be read. Reads all channels by default.

physicalbool, optional

Specifies whether to return signals in physical units in the p_signal field (True), or digital units in the d_signal field (False).

pn_dirstr, optional

Option used to stream data from Physionet. The Physionet database directory from which to find the required record files. eg. For record ‘100’ in ‘http://physionet.org/content/mitdb’ pn_dir=’mitdb’.

m2sbool, optional

Used when reading multi-segment records. Specifies whether to directly return a WFDB MultiRecord object (False), or to convert it into and return a WFDB Record object (True).

smooth_framesbool, optional

Specifies whether to smooth the samples in signals with more than one sample per frame and return an (MxN) uniform numpy array as the d_signal or p_signal field (True), or to return a list of 1d numpy arrays containing every expanded sample as the e_d_signal or e_p_signal field (False).

ignore_skewbool, optional

Used when reading records with at least one skewed signal. Specifies whether to apply the skew to align the signals in the output variable (False), or to ignore the skew field and load in all values contained in the dat files unaligned (True).

return_resint, optional

The numpy array dtype of the returned signals. Options are: 64, 32, 16, and 8, where the value represents the numpy int or float dtype. Note that the value cannot be 8 when physical is True since there is no float8 format.

force_channelsbool, optional

Used when reading multi-segment variable layout records. Whether to update the layout specification record, and the converted Record object if m2s is True, to match the input channels argument, or to omit channels in which no read segment contains the signals.

channel_nameslist, optional

List of channel names to return. If this parameter is specified, it takes precedence over channels.

warn_emptybool, optional

Whether to display a warning if the specified channel indices or names are not contained in the record, and no signal is returned.

Returns
recordRecord or MultiRecord

The WFDB Record or MultiRecord object representing the contents of the record read.

Notes

If a signal range or channel selection is specified when calling this function, the resulting attributes of the returned object will be set to reflect the section of the record that is actually read, rather than necessarily the entire record. For example, if channels=[0, 1, 2] is specified when reading a 12 channel record, the ‘n_sig’ attribute will be 3, not 12.

The rdsamp function exists as a simple alternative to rdrecord for the common purpose of extracting the physical signals and a few important descriptor fields.

Examples

>>> record = wfdb.rdrecord('sample-data/test01_00s', sampfrom=800,
                           channels=[1, 3])
wfdb.rdsamp(record_name, sampfrom=0, sampto=None, channels=None, pn_dir=None, channel_names=None, warn_empty=False, return_res=64)

Read a WFDB record, and return the physical signals and a few important descriptor fields.

Parameters
record_namestr

The name of the WFDB record to be read (without any file extensions). If the argument contains any path delimiter characters, the argument will be interpreted as PATH/baserecord and the data files will be searched for in the local path.

sampfromint, optional

The starting sample number to read for all channels.

samptoint, ‘end’, optional

The sample number at which to stop reading for all channels. Reads the entire duration by default.

channelslist, optional

List of integer indices specifying the channels to be read. Reads all channels by default.

pn_dirstr, optional

Option used to stream data from Physionet. The Physionet database directory from which to find the required record files. eg. For record ‘100’ in ‘http://physionet.org/content/mitdb’ pn_dir=’mitdb’.

channel_nameslist, optional

List of channel names to return. If this parameter is specified, it takes precedence over channels.

warn_emptybool, optional

Whether to display a warning if the specified channel indices or names are not contained in the record, and no signal is returned.

return_resint, optional

The numpy array dtype of the returned signals. Options are: 64, 32, 16, and 8, where the value represents the numpy int or float dtype. Note that the value cannot be 8 when physical is True since there is no float8 format.

Returns
signalsndarray

A 2d numpy array storing the physical signals from the record.

fieldsdict

A dictionary containing several key attributes of the read record:

  • fs: The sampling frequency of the record.

  • units: The units for each channel.

  • sig_name: The signal name for each channel.

  • comments: Any comments written in the header.

Notes

If a signal range or channel selection is specified when calling this function, the resulting attributes of the returned object will be set to reflect the section of the record that is actually read, rather than necessarily the entire record. For example, if channels=[0, 1, 2] is specified when reading a 12 channel record, the ‘n_sig’ attribute will be 3, not 12.

The rdrecord function is the base function upon which this one is built. It returns all attributes present, along with the signals, as attributes in a Record object. The function, along with the returned data type, has more options than rdsamp for users who wish to more directly manipulate WFDB content.

Examples

>>> signals, fields = wfdb.rdsamp('sample-data/test01_00s',
                                  sampfrom=800,
                                  channels=[1,3])
wfdb.wrsamp(record_name, fs, units, sig_name, p_signal=None, d_signal=None, fmt=None, adc_gain=None, baseline=None, comments=None, base_time=None, base_date=None, base_datetime=None, write_dir='')

Write a single segment WFDB record, creating a WFDB header file and any associated dat files.

Parameters
record_namestr

The string name of the WFDB record to be written (without any file extensions). Must not contain any “.”

fsint, float

The sampling frequency of the record.

unitslist

A list of strings giving the units of each signal channel.

sig_namelist, str

A list of strings giving the signal name of each signal channel.

p_signalndarray, optional

An (MxN) 2d numpy array, where M is the signal length. Gives the physical signal values intended to be written. Either p_signal or d_signal must be set, but not both. If p_signal is set, this method will use it to perform analogue-digital conversion, writing the resultant digital values to the dat file(s). If fmt is set, gain and baseline must be set or unset together. If fmt is unset, gain and baseline must both be unset.

d_signalndarray, optional

An (MxN) 2d numpy array, where M is the signal length. Gives the digital signal values intended to be directly written to the dat file(s). The dtype must be an integer type. Either p_signal or d_signal must be set, but not both. In addition, if d_signal is set, fmt, gain and baseline must also all be set.

fmtlist, optional

A list of strings giving the WFDB format of each file used to store each channel. Accepted formats are: ‘80’,’212’,’16’,’24’, and ‘32’. There are other WFDB formats as specified by: https://www.physionet.org/physiotools/wag/signal-5.htm but this library will not write (though it will read) those file types.

adc_gainlist, optional

A list of numbers specifying the ADC gain.

baselinelist, optional

A list of integers specifying the digital baseline.

commentslist, optional

A list of string comments to be written to the header file.

base_timedatetime.time, optional

The time of day at the beginning of the record.

base_datedatetime.date, optional

The date at the beginning of the record.

base_datetimedatetime.datetime, optional

The date and time at the beginning of the record, equivalent to setting both base_date and base_time.

write_dirstr, optional

The directory in which to write the files.

Returns
N/A

Notes

This is a gateway function, written as a simple method to write WFDB record files using the most common parameters. Therefore not all WFDB fields can be set via this function.

For more control over attributes, create a Record object, manually set its attributes, and call its wrsamp instance method. If you choose this more advanced method, see also the set_defaults, set_d_features, and set_p_features instance methods to help populate attributes.

Examples

>>> # Read part of a record from Physionet
>>> signals, fields = wfdb.rdsamp('a103l', sampfrom=50000, channels=[0,1],
                                  pn_dir='challenge-2015/training')
>>> # Write a local WFDB record (manually inserting fields)
>>> wfdb.wrsamp('ecgrecord', fs = 250, units=['mV', 'mV'],
                sig_name=['I', 'II'], p_signal=signals, fmt=['16', '16'])
class wfdb.Record(p_signal=None, d_signal=None, e_p_signal=None, e_d_signal=None, record_name=None, n_sig=None, fs=None, counter_freq=None, base_counter=None, sig_len=None, base_time=None, base_date=None, base_datetime=None, file_name=None, fmt=None, samps_per_frame=None, skew=None, byte_offset=None, adc_gain=None, baseline=None, units=None, adc_res=None, adc_zero=None, init_value=None, checksum=None, block_size=None, sig_name=None, comments=None)

The class representing single segment WFDB records.

Record objects can be created using the initializer, by reading a WFDB header with rdheader, or a WFDB record (header and associated dat files) with rdrecord.

The attributes of the Record object give information about the record as specified by: https://www.physionet.org/physiotools/wag/header-5.htm

In addition, the d_signal and p_signal attributes store the digital and physical signals of WFDB records with at least one channel.

Examples

>>> record = wfdb.Record(record_name='r1', fs=250, n_sig=2, sig_len=1000,
                     file_name=['r1.dat','r1.dat'])
Attributes
p_signalndarray, optional

An (MxN) 2d numpy array, where M is the signal length. Gives the physical signal values intended to be written. Either p_signal or d_signal must be set, but not both. If p_signal is set, this method will use it to perform analogue-digital conversion, writing the resultant digital values to the dat file(s). If fmt is set, gain and baseline must be set or unset together. If fmt is unset, gain and baseline must both be unset.

d_signalndarray, optional

An (MxN) 2d numpy array, where M is the signal length. Gives the digital signal values intended to be directly written to the dat file(s). The dtype must be an integer type. Either p_signal or d_signal must be set, but not both. In addition, if d_signal is set, fmt, gain and baseline must also all be set.

e_p_signalndarray, optional

The expanded physical conversion of the signal. Either a 2d numpy array or a list of 1d numpy arrays.

e_d_signalndarray, optional

The expanded digital conversion of the signal. Either a 2d numpy array or a list of 1d numpy arrays.

record_namestr, optional

The name of the WFDB record to be read, without any file extensions. If the argument contains any path delimiter characters, the argument will be interpreted as PATH/BASE_RECORD. Both relative and absolute paths are accepted. If the pn_dir parameter is set, this parameter should contain just the base record name, and the files fill be searched for remotely. Otherwise, the data files will be searched for in the local path.

n_sigint, optional

Total number of signals.

fsfloat, optional

The sampling frequency of the record.

counter_freqfloat, optional

The frequency used to start counting.

base_counterfloat, optional

The counter used at the start of the file.

sig_lenint, optional

The total length of the signal.

base_timedatetime.time, optional

The time of day at the beginning of the record.

base_datedatetime.date, optional

The date at the beginning of the record.

base_datetimedatetime.datetime, optional

The date and time at the beginning of the record, equivalent to datetime.combine(base_date, base_time).

file_namestr, optional

The name of the file used for analysis.

fmtlist, optional

A list of strings giving the WFDB format of each file used to store each channel. Accepted formats are: ‘80’,’212’,’16’,’24’, and ‘32’. There are other WFDB formats as specified by: https://www.physionet.org/physiotools/wag/signal-5.htm but this library will not write (though it will read) those file types.

samps_per_frameint, optional

The total number of samples per frame.

skewfloat, optional

The offset used to allign signals.

byte_offsetint, optional

The byte offset used to allign signals.

adc_gainlist, optional

A list of numbers specifying the ADC gain.

baselinelist, optional

A list of integers specifying the digital baseline.

unitslist, optional

A list of strings giving the units of each signal channel.

adc_res: int, optional

The value produced by the ADC given a given Volt input.

adc_zero: int, optional

The value produced by the ADC given a 0 Volt input.

init_valuelist, optional

The initial value of the signal.

checksumlist, int, optional

The checksum of the signal.

block_sizestr, optional

The dimensions of the field data.

sig_namelist, optional

A list of strings giving the signal name of each signal channel.

commentslist, optional

A list of string comments to be written to the header file.

Methods

adc([expanded, inplace])

Performs analogue to digital conversion of the physical signal stored in p_signal if expanded is False, or e_p_signal if expanded is True.

dac([expanded, return_res, inplace])

Performs the digital to analogue conversion of the signal stored in d_signal if expanded is False, or e_d_signal if expanded is True.

get_absolute_time(time_value)

Convert a time value to an absolute date and time.

get_elapsed_time(time_value)

Convert a time value to an elapsed time in seconds.

get_frame_number(time_value)

Convert a time value to a frame number.

to_dataframe()

Create a dataframe containing the data from this record.

wrsamp([expanded, write_dir])

Write a WFDB header file and any associated dat files from this object.

adc(expanded=False, inplace=False)

Performs analogue to digital conversion of the physical signal stored in p_signal if expanded is False, or e_p_signal if expanded is True.

The p_signal/e_p_signal, fmt, gain, and baseline fields must all be valid.

If inplace is True, the adc will be performed inplace on the variable, the d_signal/e_d_signal attribute will be set, and the p_signal/e_p_signal field will be set to None.

Parameters
expandedbool, optional

Whether to transform the e_p_signal attribute (True) or the p_signal attribute (False).

inplacebool, optional

Whether to automatically set the object’s corresponding digital signal attribute and set the physical signal attribute to None (True), or to return the converted signal as a separate variable without changing the original physical signal attribute (False).

Returns
d_signalndarray, optional

The digital conversion of the signal. Either a 2d numpy array or a list of 1d numpy arrays.

dac(expanded=False, return_res=64, inplace=False)

Performs the digital to analogue conversion of the signal stored in d_signal if expanded is False, or e_d_signal if expanded is True.

The d_signal/e_d_signal, fmt, gain, and baseline fields must all be valid.

If inplace is True, the dac will be performed inplace on the variable, the p_signal/e_p_signal attribute will be set, and the d_signal/e_d_signal field will be set to None.

Parameters
expandedbool, optional

Whether to transform the e_d_signal attribute (True) or the d_signal attribute (False).

return_resint, optional

The numpy array dtype of the returned signals. Options are: 64, 32, 16, and 8, where the value represents the numpy int or float dtype. Note that the value cannot be 8 when physical is True since there is no float8 format.

inplacebool, optional

Whether to automatically set the object’s corresponding physical signal attribute and set the digital signal attribute to None (True), or to return the converted signal as a separate variable without changing the original digital signal attribute (False).

Returns
p_signalndarray, optional

The physical conversion of the signal. Either a 2d numpy array or a list of 1d numpy arrays.

Examples

>>> import wfdb
>>> record = wfdb.rdsamp('sample-data/100', physical=False)
>>> p_signal = record.dac()
>>> record.dac(inplace=True)
>>> record.adc(inplace=True)
get_absolute_time(time_value)

Convert a time value to an absolute date and time.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
absolute_timedatetime

Absolute date and time.

get_elapsed_time(time_value)

Convert a time value to an elapsed time in seconds.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
elapsed_timetimedelta

Elapsed time from the start of the record.

get_frame_number(time_value)

Convert a time value to a frame number.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Note that this function may return a value that is less than zero or greater than the actual length of the record.

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
frame_numberfloat

Frame number (possibly a fractional frame number).

to_dataframe() <MagicMock id='140313993313536'>

Create a dataframe containing the data from this record.

Returns
A dataframe, with sig_name in the columns. The index is a DatetimeIndex
if both base_date and base_time were set, otherwise a TimedeltaIndex.
wrsamp(expanded=False, write_dir='')

Write a WFDB header file and any associated dat files from this object.

Parameters
expandedbool, optional

Whether to write the expanded signal (e_d_signal) instead of the uniform signal (d_signal).

write_dirstr, optional

The directory in which to write the files.

Returns
N/A
class wfdb.MultiRecord(segments=None, layout=None, record_name=None, n_sig=None, fs=None, counter_freq=None, base_counter=None, sig_len=None, base_time=None, base_date=None, base_datetime=None, seg_name=None, seg_len=None, comments=None, sig_name=None, sig_segments=None)

The class representing multi-segment WFDB records.

MultiRecord objects can be created using the initializer, or by reading a multi-segment WFDB record using ‘rdrecord’ with the m2s (multi to single) input parameter set to False.

The attributes of the MultiRecord object give information about the entire record as specified by: https://www.physionet.org/physiotools/wag/header-5.htm

In addition, the segments parameter is a list of Record objects representing each individual segment, or None representing empty segments, of the entire multi-segment record.

Notably, this class has no attribute representing the signals as a whole. The ‘multi_to_single’ instance method can be called on MultiRecord objects to return a single segment representation of the record as a Record object. The resulting Record object will have its ‘p_signal’ field set.

Examples

>>> record_m = wfdb.MultiRecord(record_name='rm', fs=50, n_sig=8,
                                sig_len=9999, seg_name=['rm_1', '~', rm_2'],
                                seg_len=[800, 200, 900])
>>> # Get a MultiRecord object
>>> record_s = wfdb.rdsamp('s00001-2896-10-10-00-31', m2s=False)
>>> # Turn it into a single record
>>> record_s = record_s.multi_to_single()

record_s initially stores a MultiRecord object, and is then converted into a Record object.

Attributes
segmentslist, optional

The segments to be read.

layoutstr, optional

Whether the record will be ‘fixed’ or ‘variable’.

record_namestr, optional

The name of the WFDB record to be read, without any file extensions. If the argument contains any path delimiter characters, the argument will be interpreted as PATH/BASE_RECORD. Both relative and absolute paths are accepted. If the pn_dir parameter is set, this parameter should contain just the base record name, and the files fill be searched for remotely. Otherwise, the data files will be searched for in the local path.

n_sigint, optional

Total number of signals.

fsint, float, optional

The sampling frequency of the record.

counter_freqfloat, optional

The frequency used to start counting.

base_counterfloat, optional

The counter used at the start of the file.

sig_lenint, optional

The total length of the signal.

base_timedatetime.time, optional

The time of day at the beginning of the record.

base_datedatetime.date, optional

The date at the beginning of the record.

base_datetimedatetime.datetime, optional

The date and time at the beginning of the record, equivalent to datetime.combine(base_date, base_time).

seg_namestr, optional

The name of the segment.

seg_lenList[int], optional

The length of each segment.

commentslist, optional

A list of string comments to be written to the header file.

sig_namestr, optional

A list of strings giving the signal name of each signal channel.

sig_segmentslist, optional

The signal segments to be read.

Methods

contained_combined_ranges(sig_names)

Given a collection of signal name, return the sample ranges that contain all of the specified signals, relative to the start of the full record.

contained_ranges(sig_name)

Given a signal name, return the sample ranges that contain signal values, relative to the start of the full record.

get_absolute_time(time_value)

Convert a time value to an absolute date and time.

get_elapsed_time(time_value)

Convert a time value to an elapsed time in seconds.

get_frame_number(time_value)

Convert a time value to a frame number.

multi_to_single(physical[, return_res, expanded])

Create a Record object from the MultiRecord object.

contained_combined_ranges(sig_names: Sequence[str]) List[Tuple[int, int]]

Given a collection of signal name, return the sample ranges that contain all of the specified signals, relative to the start of the full record. Does not account for NaNs/missing values.

This function is mainly useful for variable layout records, but can also be used for fixed-layout records. Only works if the headers from the individual segment records have already been read in.

Parameters
sig_namesList[str]

The names of the signals to query.

Returns
rangesList[Tuple[int, int]]

Tuple pairs which specify thee sample ranges in which the signal is contained. The second value of each tuple pair will be one beyond the signal index. eg. A length 1000 signal would generate a tuple of: (0, 1000), allowing selection using signal[0:1000].

contained_ranges(sig_name: str) List[Tuple[int, int]]

Given a signal name, return the sample ranges that contain signal values, relative to the start of the full record. Does not account for NaNs/missing values.

This function is mainly useful for variable layout records, but can also be used for fixed-layout records. Only works if the headers from the individual segment records have already been read in.

Parameters
sig_namestr

The name of the signal to query.

Returns
rangesList[Tuple[int, int]]

Tuple pairs which specify thee sample ranges in which the signal is contained. The second value of each tuple pair will be one beyond the signal index. eg. A length 1000 signal would generate a tuple of: (0, 1000), allowing selection using signal[0:1000].

get_absolute_time(time_value)

Convert a time value to an absolute date and time.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
absolute_timedatetime

Absolute date and time.

get_elapsed_time(time_value)

Convert a time value to an elapsed time in seconds.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
elapsed_timetimedelta

Elapsed time from the start of the record.

get_frame_number(time_value)

Convert a time value to a frame number.

A time value may be specified as: - An integer or floating-point number, representing the number of

WFDB frames elapsed from the start of the record.

  • A datetime.timedelta object, representing elapsed time from the start of the record.

  • A datetime.datetime object, representing an absolute date and time (if the record starting time is known.)

Note that this function may return a value that is less than zero or greater than the actual length of the record.

Parameters
time_valuenumber or timedelta or datetime

A time value.

Returns
frame_numberfloat

Frame number (possibly a fractional frame number).

multi_to_single(physical, return_res=64, expanded=False)

Create a Record object from the MultiRecord object. All signal segments will be combined into the new object’s p_signal or d_signal field. For digital format, the signals must have the same storage format, baseline, and adc_gain in all segments.

Parameters
physicalbool

Whether to convert the physical or digital signal.

return_resint, optional

The return resolution of the p_signal field. Options are: 64, 32, and 16.

expandedbool, optional

If false, combine the sample data from p_signal or d_signal into a single two-dimensional array. If true, combine the sample data from e_p_signal or e_d_signal into a list of one-dimensional arrays.

Returns
recordWFDB Record

The single segment record created.

WFDB Annotations

wfdb.rdann(record_name, extension, sampfrom=0, sampto=None, shift_samps=False, pn_dir=None, return_label_elements=['symbol'], summarize_labels=False)

Read a WFDB annotation file record_name.extension and return an Annotation object.

Parameters
record_namestr

The record name of the WFDB annotation file. ie. for file ‘100.atr’, record_name=’100’.

extensionstr

The annotatator extension of the annotation file. ie. for file ‘100.atr’, extension=’atr’.

sampfromint, optional

The minimum sample number for annotations to be returned.

samptoint, optional

The maximum sample number for annotations to be returned.

shift_sampsbool, optional

Specifies whether to return the sample indices relative to sampfrom (True), or sample 0 (False).

pn_dirstr, optional

Option used to stream data from Physionet. The PhysioNet database directory from which to find the required annotation file. eg. For record ‘100’ in ‘http://physionet.org/content/mitdb’: pn_dir=’mitdb’.

return_label_elementslist, optional

The label elements that are to be returned from reading the annotation file. A list with at least one of the following options: ‘symbol’, ‘label_store’, ‘description’.

summarize_labelsbool, optional

If True, assign a summary table of the set of annotation labels contained in the file to the ‘contained_labels’ attribute of the returned object. This table will contain the columns: [‘label_store’, ‘symbol’, ‘description’, ‘n_occurrences’].

Returns
annotationAnnotation

The Annotation object. Call help(wfdb.Annotation) for the attribute descriptions.

Notes

For every annotation sample, the annotation file explictly stores the ‘sample’ and ‘symbol’ fields, but not necessarily the others. When reading annotation files using this function, fields which are not stored in the file will either take their default values of 0 or None, or will be carried over from their previous values if any.

Examples

>>> ann = wfdb.rdann('sample-data/100', 'atr', sampto=300000)
wfdb.show_ann_classes()

Display the standard WFDB annotation classes.

Parameters
N/A
Returns
N/A

Examples

>>> show_ann_classes()
wfdb.show_ann_labels()

Display the standard WFDB annotation label mapping.

Parameters
N/A
Returns
N/A

Examples

>>> show_ann_labels()
wfdb.wrann(record_name, extension, sample, symbol=None, subtype=None, chan=None, num=None, aux_note=None, label_store=None, fs=None, custom_labels=None, write_dir='')

Write a WFDB annotation file.

Specify at least the following:

  • The record name of the WFDB record (record_name).

  • The annotation file extension (extension).

  • The annotation locations in samples relative to the beginning of the record (sample).

  • Either the numerical values used to store the labels. (label_store), or more commonly, the display symbols of each label (symbol).

Parameters
record_namestr

The string name of the WFDB record to be written (without any file extensions).

extensionstr

The string annotation file extension.

samplendarray

A numpy array containing the annotation locations in samples relative to the beginning of the record.

symbollist, numpy array, optional

The symbols used to display the annotation labels. List or numpy array. If this field is present, label_store must not be present.

subtypendarray, optional

A numpy array containing the marked class/category of each annotation.

channdarray, optional

A numpy array containing the signal channel associated with each annotation.

numndarray, optional

A numpy array containing the labelled annotation number for each annotation.

aux_notelist, optional

A list containing the auxiliary information string (or None for annotations without notes) for each annotation.

label_storendarray, optional

A numpy array containing the integer values used to store the annotation labels. If this field is present, symbol must not be present.

fsint, float, optional

The numerical sampling frequency of the record to be written to the file.

custom_labelspandas dataframe, optional

The map of custom defined annotation labels used for this annotation, in addition to the standard WFDB annotation labels. Custom labels are defined by two or three fields:

  • The integer values used to store custom annotation labels in the file (optional).

  • Their short display symbols

  • Their long descriptions.

This input argument may come in four formats:

  1. A pandas.DataFrame object with columns: [‘label_store’, ‘symbol’, ‘description’]

  2. A pandas.DataFrame object with columns: [‘symbol’, ‘description’] If this option is chosen, label_store values are automatically chosen.

  3. A list or tuple of tuple triplets, with triplet elements representing: (label_store, symbol, description).

  4. A list or tuple of tuple pairs, with pair elements representing: (symbol, description). If this option is chosen, label_store values are automatically chosen.

If the label_store field is given for this function, and custom_labels is defined, custom_labels must contain label_store in its mapping. ie. it must come in format 1 or 3 above.

write_dirstr, optional

The directory in which to write the annotation file

Returns
N/A

Notes

This is a gateway function, written as a simple way to write WFDB annotation files without needing to explicity create an Annotation object. You may also create an Annotation object, manually set its attributes, and call its wrann instance method.

Each annotation stored in a WFDB annotation file contains a sample field and a label field. All other fields may or may not be present.

Examples

>>> # Read an annotation as an Annotation object
>>> annotation = wfdb.rdann('b001', 'atr', pn_dir='cebsdb')
>>> # Write a copy of the annotation file
>>> wfdb.wrann('b001', 'cpy', annotation.sample, annotation.symbol)
class wfdb.Annotation(record_name, extension, sample, symbol=None, subtype=None, chan=None, num=None, aux_note=None, fs=None, label_store=None, description=None, custom_labels=None, contained_labels=None)

The class representing WFDB annotations.

Annotation objects can be created using the initializer, or by reading a WFDB annotation file with rdann.

The attributes of the Annotation object give information about the annotation as specified by: https://www.physionet.org/physiotools/wag/annot-5.htm

Call show_ann_labels() to see the list of standard annotation codes. Any text used to label annotations that are not one of these codes should go in the ‘aux_note’ field rather than the ‘sym’ field.

The current annotation values organized as such:

AnnotationLabel(label_store (or subtype), symbol (or aux_note), short_description, description)

where the associated values are:

ann_labels = [

AnnotationLabel(0, ” “, ‘NOTANN’, ‘Not an actual annotation’), AnnotationLabel(1, “N”, ‘NORMAL’, ‘Normal beat’), AnnotationLabel(2, “L”, ‘LBBB’, ‘Left bundle branch block beat’), AnnotationLabel(3, “R”, ‘RBBB’, ‘Right bundle branch block beat’), AnnotationLabel(4, “a”, ‘ABERR’, ‘Aberrated atrial premature beat’), AnnotationLabel(5, “V”, ‘PVC’, ‘Premature ventricular contraction’), AnnotationLabel(6, “F”, ‘FUSION’, ‘Fusion of ventricular and normal beat’), AnnotationLabel(7, “J”, ‘NPC’, ‘Nodal (junctional) premature beat’), AnnotationLabel(8, “A”, ‘APC’, ‘Atrial premature contraction’), AnnotationLabel(9, “S”, ‘SVPB’, ‘Premature or ectopic supraventricular beat’), AnnotationLabel(10, “E”, ‘VESC’, ‘Ventricular escape beat’), AnnotationLabel(11, “j”, ‘NESC’, ‘Nodal (junctional) escape beat’), AnnotationLabel(12, “/”, ‘PACE’, ‘Paced beat’), AnnotationLabel(13, “Q”, ‘UNKNOWN’, ‘Unclassifiable beat’), AnnotationLabel(14, “~”, ‘NOISE’, ‘Signal quality change’), AnnotationLabel(16, “|”, ‘ARFCT’, ‘Isolated QRS-like artifact’), AnnotationLabel(18, “s”, ‘STCH’, ‘ST change’), AnnotationLabel(19, “T”, ‘TCH’, ‘T-wave change’), AnnotationLabel(20, “*”, ‘SYSTOLE’, ‘Systole’), AnnotationLabel(21, “D”, ‘DIASTOLE’, ‘Diastole’), AnnotationLabel(22, ‘”’, ‘NOTE’, ‘Comment annotation’), AnnotationLabel(23, “=”, ‘MEASURE’, ‘Measurement annotation’), AnnotationLabel(24, “p”, ‘PWAVE’, ‘P-wave peak’), AnnotationLabel(25, “B”, ‘BBB’, ‘Left or right bundle branch block’), AnnotationLabel(26, “^”, ‘PACESP’, ‘Non-conducted pacer spike’), AnnotationLabel(27, “t”, ‘TWAVE’, ‘T-wave peak’), AnnotationLabel(28, “+”, ‘RHYTHM’, ‘Rhythm change’), AnnotationLabel(29, “u”, ‘UWAVE’, ‘U-wave peak’), AnnotationLabel(30, “?”, ‘LEARN’, ‘Learning’), AnnotationLabel(31, “!”, ‘FLWAV’, ‘Ventricular flutter wave’), AnnotationLabel(32, “[”, ‘VFON’, ‘Start of ventricular flutter/fibrillation’), AnnotationLabel(33, “]”, ‘VFOFF’, ‘End of ventricular flutter/fibrillation’), AnnotationLabel(34, “e”, ‘AESC’, ‘Atrial escape beat’), AnnotationLabel(35, “n”, ‘SVESC’, ‘Supraventricular escape beat’), AnnotationLabel(36, “@”, ‘LINK’, ‘Link to external data (aux_note contains URL)’), AnnotationLabel(37, “x”, ‘NAPC’, ‘Non-conducted P-wave (blocked APB)’), AnnotationLabel(38, “f”, ‘PFUS’, ‘Fusion of paced and normal beat’), AnnotationLabel(39, “(”, ‘WFON’, ‘Waveform onset’), AnnotationLabel(40, “)”, ‘WFOFF’, ‘Waveform end’), AnnotationLabel(41, “r”, ‘RONT’, ‘R-on-T premature ventricular contraction’)

]

The current annotation classes are organized as such:

AnnotationClass(extension, description, human_reviewed)

where the associated values are:

ann_classes = [

AnnotationClass(‘atr’, ‘Reference ECG annotations’, True), AnnotationClass(‘blh’, ‘Human reviewed beat labels’, True), AnnotationClass(‘blm’, ‘Machine beat labels’, False), AnnotationClass(‘alh’, ‘Human reviewed alarms’, True), AnnotationClass(‘alm’, ‘Machine alarms’, False), AnnotationClass(‘qrsc’, ‘Human reviewed QRS detections’, True), AnnotationClass(‘qrs’, ‘Machine QRS detections’, False), AnnotationClass(‘bph’, ‘Human reviewed BP beat detections’, True), AnnotationClass(‘bpm’, ‘Machine BP beat detections’, False)

]

Examples

>>> ann1 = wfdb.Annotation(record_name='rec1', extension='atr',
                           sample=[10,20,400], symbol=['N','N','['],
                           aux_note=[None, None, 'Serious Vfib'])
Attributes
record_namestr

The base file name (without extension) of the record that the annotation is associated with.

extensionstr

The file extension of the file the annotation is stored in.

samplendarray

A numpy array containing the annotation locations in samples relative to the beginning of the record.

symbollist, numpy array, optional

The symbols used to display the annotation labels. List or numpy array. If this field is present, label_store must not be present.

subtypendarray, optional

A numpy array containing the marked class/category of each annotation.

channdarray, optional

A numpy array containing the signal channel associated with each annotation.

numndarray, optional

A numpy array containing the labelled annotation number for each annotation.

aux_notelist, optional

A list containing the auxiliary information string (or None for annotations without notes) for each annotation.

fsint, float, optional

The sampling frequency of the record.

label_storendarray, optional

The integer value used to store/encode each annotation label

descriptionlist, optional

A list containing the descriptive string of each annotation label.

custom_labelspandas dataframe, optional

The custom annotation labels defined in the annotation file. Maps the relationship between the three label fields. The data type is a pandas DataFrame with three columns: [‘label_store’, ‘symbol’, ‘description’].

contained_labelspandas dataframe, optional

The unique labels contained in this annotation. Same structure as custom_labels.

Methods

wrann([write_fs, write_dir])

Write a WFDB annotation file from this object.

wrann(write_fs=False, write_dir='')

Write a WFDB annotation file from this object.

Parameters
write_fsbool, optional

Whether to write the fs attribute to the file.

write_dirstr, optional

The output directory in which the header is written.

Returns
N/A

Downloading

wfdb.dl_database(db_dir, dl_dir, records='all', annotators='all', keep_subdirs=True, overwrite=False)

Download WFDB record (and optionally annotation) files from a PhysioNet database. The database must contain a ‘RECORDS’ file in its base directory which lists its WFDB records.

Parameters
db_dirstr

The PhysioNet database directory to download. eg. For database: ‘http://physionet.org/content/mitdb/’, db_dir=’mitdb’.

dl_dirstr

The full local directory path in which to download the files.

recordslist, ‘all’, optional

A list of strings specifying the WFDB records to download. Leave as ‘all’ to download all records listed in the database’s RECORDS file. eg. records=[‘test01_00s’, test02_45s] for database: https://physionet.org/content/macecgdb/

annotatorslist, ‘all’, None, optional

A list of strings specifying the WFDB annotation file types to download along with the record files. Is either None to skip downloading any annotations, ‘all’ to download all annotation types as specified by the ANNOTATORS file, or a list of strings which each specify an annotation extension. eg. annotators = [‘anI’] for database: https://physionet.org/content/prcp/

keep_subdirsbool, optional

Whether to keep the relative subdirectories of downloaded files as they are organized in PhysioNet (True), or to download all files into the same base directory (False).

overwritebool, optional

If True, all files will be redownloaded regardless. If False, existing files with the same name and relative subdirectory will be checked. If the local file is the same size as the online file, the download is skipped. If the local file is larger, it will be deleted and the file will be redownloaded. If the local file is smaller, the file will be assumed to be partially downloaded and the remaining bytes will be downloaded and appended.

Returns
N/A

Examples

>>> wfdb.dl_database('ahadb', os.getcwd())
wfdb.dl_files(db, dl_dir, files, keep_subdirs=True, overwrite=False)

Download specified files from a PhysioNet database.

Parameters
dbstr

The PhysioNet database directory to download. eg. For database: ‘http://physionet.org/content/mitdb’, db=’mitdb’.

dl_dirstr

The full local directory path in which to download the files.

fileslist

A list of strings specifying the file names to download relative to the database base directory.

keep_subdirsbool, optional

Whether to keep the relative subdirectories of downloaded files as they are organized in PhysioNet (True), or to download all files into the same base directory (False).

overwritebool, optional

If True, all files will be redownloaded regardless. If False, existing files with the same name and relative subdirectory will be checked. If the local file is the same size as the online file, the download is skipped. If the local file is larger, it will be deleted and the file will be redownloaded. If the local file is smaller, the file will be assumed to be partially downloaded and the remaining bytes will be downloaded and appended.

Returns
N/A

Examples

>>> wfdb.dl_files('ahadb', os.getcwd(),
                  ['STAFF-Studies-bibliography-2016.pdf', 'data/001a.hea',
                  'data/001a.dat'])
wfdb.get_dbs()

Get a list of all the PhysioNet databases available.

Parameters
N/A
Returns
dbslist

All of the databases currently available for analysis.

Examples

>>> dbs = wfdb.get_dbs()
>>> dbs
[
 ['aami-ec13', 'ANSI/AAMI EC13 Test Waveforms'],
 ['adfecgdb', 'Abdominal and Direct Fetal ECG Database'],
 ...
 ['wrist', 'Wrist PPG During Exercise']
]
wfdb.get_record_list(db_dir, records='all')

Get a list of records belonging to a database.

Parameters
db_dirstr

The database directory, usually the same as the database slug. The location to look for a RECORDS file.

recordslist, optional

An option used when this function acts as a helper function. Leave as default ‘all’ to get all records.

Returns
record_listlist

All of the possible record names for the input database.

Examples

>>> wfdb.get_record_list('mitdb')
wfdb.set_db_index_url(db_index_url='https://physionet.org/files/')

Set the database index url to a custom value, to stream remote files from another location.

Parameters
db_index_urlstr, optional

The desired new database index url. Leave as default to reset to the PhysioNet index url.

Returns
N/A

Plotting

wfdb.plot_all_records(directory='')

Plot all WFDB records in a directory (by finding header files), one at a time, until the ‘enter’ key is pressed.

Parameters
directorystr, optional

The directory in which to search for WFDB records. Defaults to current working directory.

Returns
N/A
wfdb.plot_items(signal=None, ann_samp=None, ann_sym=None, fs=None, time_units='samples', sig_name=None, sig_units=None, xlabel=None, ylabel=None, title=None, sig_style=[''], ann_style=['r*'], ecg_grids=[], figsize=None, sharex=False, sharey=False, return_fig=False, return_fig_axes=False, sampling_freq=None, ann_freq=None)

Subplot individual channels of signals and/or annotations.

Parameters
signal1d or 2d numpy array or list, optional

The signal or signals to be plotted. If signal is a one-dimensional array, it is assumed to represent a single channel. If it is a two-dimensional array, axes 0 and 1 must represent time and channel number respectively. Otherwise it must be a list of one-dimensional arrays (one for each channel).

ann_samp: list, optional

A list of annotation locations to plot, with each list item corresponding to a different channel. List items may be:

  • 1d numpy array, with values representing sample indices. Empty arrays are skipped.

  • list, with values representing sample indices. Empty lists are skipped.

  • None. For channels in which nothing is to be plotted.

If signal is defined, the annotation locations will be overlaid on the signals, with the list index corresponding to the signal channel. The length of annotation does not have to match the number of channels of signal.

ann_sym: list, optional

A list of annotation symbols to plot, with each list item corresponding to a different channel. List items should be lists of strings. The symbols are plotted over the corresponding ann_samp index locations.

fsint, float, optional

The sampling frequency of the signals and/or annotations. Used to calculate time intervals if time_units is not ‘samples’. Also required for plotting ECG grids.

time_unitsstr, optional

The x axis unit. Allowed options are: ‘samples’, ‘seconds’, ‘minutes’, and ‘hours’.

sig_namelist, optional

A list of strings specifying the signal names. Used with sig_units to form y labels, if ylabel is not set.

sig_unitslist, optional

A list of strings specifying the units of each signal channel. Used with sig_name to form y labels, if ylabel is not set. This parameter is required for plotting ECG grids.

xlabellist, optional

A list of strings specifying the final x labels to be used. If this option is present, no ‘time/’time_units is used.

ylabellist, optional

A list of strings specifying the final y labels. If this option is present, sig_name and sig_units will not be used for labels.

titlestr, optional

The title of the graph.

sig_stylelist, optional

A list of strings, specifying the style of the matplotlib plot for each signal channel. The list length should match the number of signal channels. If the list has a length of 1, the style will be used for all channels.

ann_stylelist, optional

A list of strings, specifying the style of the matplotlib plot for each annotation channel. If the list has a length of 1, the style will be used for all channels.

ecg_gridslist, optional

A list of integers specifying channels in which to plot ECG grids. May also be set to ‘all’ for all channels. Major grids at 0.5mV, and minor grids at 0.125mV. All channels to be plotted with grids must have sig_units equal to ‘uV’, ‘mV’, or ‘V’.

sharex, shareybool, optional

Controls sharing of properties among x (sharex) or y (sharey) axes. If True: x- or y-axis will be shared among all subplots. If False, each subplot x- or y-axis will be independent.

figsizetuple, optional

Tuple pair specifying the width, and height of the figure. It is the ‘figsize’ argument passed into matplotlib.pyplot’s figure function.

return_figbool, optional

Whether the figure is to be returned as an output argument.

sampling_freqnumber or sequence, optional

The sampling frequency or frequencies of the signals. If this is a list, it must have the same length as the number of channels. If unspecified, defaults to fs.

ann_freqnumber or sequence, optional

The sampling frequency or frequencies of the annotations. If this is a list, it must have the same length as ann_samp. If unspecified, defaults to fs.

Returns
figmatplotlib figure, optional

The matplotlib figure generated. Only returned if the ‘return_fig’ or ‘return_fig_axes’ parameter is set to True.

axesmatplotlib axes, optional

The matplotlib axes generated. Only returned if the ‘return_fig_axes’ parameter is set to True.

Examples

>>> record = wfdb.rdrecord('sample-data/100', sampto=3000)
>>> ann = wfdb.rdann('sample-data/100', 'atr', sampto=3000)
>>> wfdb.plot_items(signal=record.p_signal,
                    ann_samp=[ann.sample, ann.sample],
                    title='MIT-BIH Record 100', time_units='seconds',
                    figsize=(10,4), ecg_grids='all')
wfdb.plot_wfdb(record=None, annotation=None, plot_sym=False, time_units='seconds', title=None, sig_style=[''], ann_style=['r*'], ecg_grids=[], figsize=None, return_fig=False, sharex='auto')

Subplot individual channels of a WFDB record and/or annotation.

This function implements the base functionality of the plot_items function, while allowing direct input of WFDB objects.

If the record object is input, the function will extract from it:
  • signal values, from the e_p_signal, e_d_signal, p_signal, or d_signal attribute (in that order of priority.)

  • frame frequency, from the fs attribute

  • signal names, from the sig_name attribute

  • signal units, from the units attribute

If the annotation object is input, the function will extract from it:
  • sample locations, from the sample attribute

  • symbols, from the symbol attribute

  • the annotation channels, from the chan attribute

  • the sampling frequency, from the fs attribute if present, and if fs was not already extracted from the record argument.

Parameters
recordWFDB Record, optional

The Record object to be plotted.

annotationWFDB Annotation, optional

The Annotation object to be plotted.

plot_symbool, optional

Whether to plot the annotation symbols on the graph.

time_unitsstr, optional

The x axis unit. Allowed options are: ‘samples’, ‘seconds’, ‘minutes’, and ‘hours’.

titlestr, optional

The title of the graph.

sig_stylelist, optional

A list of strings, specifying the style of the matplotlib plot for each signal channel. The list length should match the number of signal channels. If the list has a length of 1, the style will be used for all channels.

ann_stylelist, optional

A list of strings, specifying the style of the matplotlib plot for each annotation channel. The list length should match the number of annotation channels. If the list has a length of 1, the style will be used for all channels.

ecg_gridslist, optional

A list of integers specifying channels in which to plot ECG grids. May also be set to ‘all’ for all channels. Major grids at 0.5mV, and minor grids at 0.125mV. All channels to be plotted with grids must have sig_units equal to ‘uV’, ‘mV’, or ‘V’.

figsizetuple, optional

Tuple pair specifying the width, and height of the figure. It is the ‘figsize’ argument passed into matplotlib.pyplot’s figure function.

return_figbool, optional

Whether the figure is to be returned as an output argument.

sharexbool or ‘auto’, optional

Whether the X axis should be shared between all subplots. If set to True, then all signals will be aligned with each other. If set to False, then each subplot can be panned/zoomed independently. If set to ‘auto’ (default), then the X axis will be shared unless record is multi-frequency and the time units are set to ‘samples’.

Returns
figurematplotlib figure, optional

The matplotlib figure generated. Only returned if the ‘return_fig’ option is set to True.

Examples

>>> record = wfdb.rdrecord('sample-data/100', sampto=3000)
>>> annotation = wfdb.rdann('sample-data/100', 'atr', sampto=3000)
>>> wfdb.plot_wfdb(record=record, annotation=annotation, plot_sym=True
                   time_units='seconds', title='MIT-BIH Record 100',
                   figsize=(10,4), ecg_grids='all')