Skip to content

Commit 88af056

Browse files
committed
Add to_dataframe() to Record.
1 parent 0d42dfb commit 88af056

File tree

3 files changed

+77748
-114
lines changed

3 files changed

+77748
-114
lines changed

demo.ipynb

Lines changed: 77695 additions & 114 deletions
Large diffs are not rendered by default.

tests/test_record.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
import os
23
import shutil
34
import unittest
@@ -527,6 +528,16 @@ def test_4d(self):
527528

528529
assert np.array_equal(sig_round, sig_target)
529530

531+
def test_to_dataframe(self):
532+
record = wfdb.rdrecord("sample-data/test01_00s")
533+
df = record.to_dataframe()
534+
535+
self.assertEqual(record.sig_name, list(df.columns))
536+
self.assertEqual(len(df), record.sig_len)
537+
self.assertEqual(df.index[0], datetime.timedelta())
538+
self.assertEqual(df.index[-1], datetime.timedelta(seconds=1 / record.fs * (record.sig_len - 1)))
539+
assert np.array_equal(record.p_signal, df.values)
540+
530541
def test_header_with_non_utf8(self):
531542
"""
532543
Ignores non-utf8 characters in the header part.

wfdb/io/record.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,48 @@ def _arrange_fields(self, channels, sampfrom, smooth_frames):
851851
# Adjust date and time if necessary
852852
self._adjust_datetime(sampfrom=sampfrom)
853853

854+
def to_dataframe(self) -> pd.DataFrame:
855+
"""
856+
Create a dataframe containing the data from this record.
857+
858+
859+
Returns
860+
-------
861+
A dataframe, with sig_name in the columns. The index is a DatetimeIndex
862+
if both base_date and base_time were set, otherwise a TimedeltaIndex.
863+
"""
864+
if self.base_date and self.base_time:
865+
index = pd.date_range(
866+
start=datetime.datetime.combine(
867+
self.base_date, self.base_time
868+
),
869+
periods=self.sig_len,
870+
freq=datetime.timedelta(seconds=1 / self.fs),
871+
)
872+
else:
873+
index = pd.timedelta_range(
874+
start=datetime.timedelta(),
875+
periods=self.sig_len,
876+
freq=datetime.timedelta(seconds=1 / self.fs),
877+
)
878+
879+
if self.p_signal is not None:
880+
data = self.p_signal
881+
elif self.d_signal is not None:
882+
data = self.d_signal
883+
elif self.e_p_signal is not None:
884+
data = np.array(self.e_p_signal).T
885+
elif self.e_d_signal is not None:
886+
data = np.array(self.e_d_signal).T
887+
else:
888+
raise ValueError("No signal in record.")
889+
890+
return pd.DataFrame(
891+
data=data,
892+
index=index,
893+
columns=self.sig_name
894+
)
895+
854896

855897
class MultiRecord(BaseRecord, _header.MultiHeaderMixin):
856898
"""

0 commit comments

Comments
 (0)