Skip to content

Commit 14df878

Browse files
authored
Add to_dataframe() to Record. (#380)
1 parent 4c784fa commit 14df878

File tree

3 files changed

+77746
-114
lines changed

3 files changed

+77746
-114
lines changed

demo.ipynb

+77,695-114
Large diffs are not rendered by default.

tests/test_record.py

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import unittest
55

66
import numpy as np
7+
import pandas as pd
78

89
import wfdb
910

@@ -581,6 +582,16 @@ def test_4d(self):
581582

582583
assert np.array_equal(sig_round, sig_target)
583584

585+
def test_to_dataframe(self):
586+
record = wfdb.rdrecord("sample-data/test01_00s")
587+
df = record.to_dataframe()
588+
589+
self.assertEqual(record.sig_name, list(df.columns))
590+
self.assertEqual(len(df), record.sig_len)
591+
self.assertEqual(df.index[0], pd.Timedelta(0))
592+
self.assertEqual(df.index[-1], pd.Timedelta(seconds=1 / record.fs * (record.sig_len - 1)))
593+
assert np.array_equal(record.p_signal, df.values)
594+
584595
def test_header_with_non_utf8(self):
585596
"""
586597
Ignores non-utf8 characters in the header part.

wfdb/io/record.py

+40
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,46 @@ def _arrange_fields(self, channels, sampfrom, smooth_frames):
986986
# Adjust date and time if necessary
987987
self._adjust_datetime(sampfrom=sampfrom)
988988

989+
def to_dataframe(self) -> pd.DataFrame:
990+
"""
991+
Create a dataframe containing the data from this record.
992+
993+
994+
Returns
995+
-------
996+
A dataframe, with sig_name in the columns. The index is a DatetimeIndex
997+
if both base_date and base_time were set, otherwise a TimedeltaIndex.
998+
"""
999+
if self.base_datetime is not None:
1000+
index = pd.date_range(
1001+
start=self.base_datetime,
1002+
periods=self.sig_len,
1003+
freq=pd.Timedelta(seconds=1 / self.fs),
1004+
)
1005+
else:
1006+
index = pd.timedelta_range(
1007+
start=pd.Timedelta(0),
1008+
periods=self.sig_len,
1009+
freq=pd.Timedelta(seconds=1 / self.fs),
1010+
)
1011+
1012+
if self.p_signal is not None:
1013+
data = self.p_signal
1014+
elif self.d_signal is not None:
1015+
data = self.d_signal
1016+
elif self.e_p_signal is not None:
1017+
data = np.array(self.e_p_signal).T
1018+
elif self.e_d_signal is not None:
1019+
data = np.array(self.e_d_signal).T
1020+
else:
1021+
raise ValueError("No signal in record.")
1022+
1023+
return pd.DataFrame(
1024+
data=data,
1025+
index=index,
1026+
columns=self.sig_name
1027+
)
1028+
9891029

9901030
class MultiRecord(BaseRecord, _header.MultiHeaderMixin):
9911031
"""

0 commit comments

Comments
 (0)