diff --git a/neo/rawio/neuralynxrawio/nlxheader.py b/neo/rawio/neuralynxrawio/nlxheader.py index 54bd57c99..292ed8458 100644 --- a/neo/rawio/neuralynxrawio/nlxheader.py +++ b/neo/rawio/neuralynxrawio/nlxheader.py @@ -1,6 +1,7 @@ from packaging.version import Version import os import re +import warnings from collections import OrderedDict from neo.rawio.neuralynxrawio.ncssections import AcqType @@ -350,7 +351,11 @@ def _setTimeDate(self, txt_header): sr = NlxHeader._closeDatetime2_pat.search(txt_header) if sr: dt2 = sr.groupdict() - self["recording_closed"] = dateutil.parser.parse(f"{dt2['date']} {dt2['time']}") + if (dt2["date"], dt2["time"]) == ("File", "was"): + # Cheetah writes this in place of the close time, see #1901 + warnings.warn("Text header does not contain recording closed time. File was not closed properly.") + else: + self["recording_closed"] = dateutil.parser.parse(f"{dt2['date']} {dt2['time']}") def _normalize_types(self): """ diff --git a/neo/test/rawiotest/test_neuralynxrawio.py b/neo/test/rawiotest/test_neuralynxrawio.py index 0a1c90980..4f2581e1d 100644 --- a/neo/test/rawiotest/test_neuralynxrawio.py +++ b/neo/test/rawiotest/test_neuralynxrawio.py @@ -563,5 +563,17 @@ def test_filename_prop(self): self.assertEqual(r"C:\CheetahData\2000-01-01_00-00-00\CSC5.ncs", hdr["OriginalFileName"]) +class TestNlxHeaderParsing(unittest.TestCase): + def test_unclosed_recording(self): + header = NlxHeader.__new__(NlxHeader) + with self.assertWarnsRegex(UserWarning, "File was not closed properly"): + header._setTimeDate( + "## Time Opened: (m/d/y): 1/1/2000 (h:m:s.ms) 18:28:39.821\n" + "## Date Closed: (m/d/y): File At Time: was not properly closed" + ) + + self.assertIsNone(header.get("recording_closed")) + + if __name__ == "__main__": unittest.main()