Merge pull request #63 from chatcannon/time-format-dotted

Add '%m.%d.%y' date format for .mpr file timestamps
This commit is contained in:
2021-09-01 07:06:58 +03:00
committed by GitHub
2 changed files with 41 additions and 12 deletions

View File

@@ -246,6 +246,26 @@ VMPdata_colID_flag_map = {
} }
def parse_BioLogic_date(date_text):
"""Parse a date from one of the various formats used by Bio-Logic files."""
date_formats = ['%m/%d/%y', '%m-%d-%y', '%m.%d.%y']
if isinstance(date_text, bytes):
date_string = date_text.decode('ascii')
else:
date_string = date_text
for date_format in date_formats:
try:
tm = time.strptime(date_string, date_format)
except ValueError:
continue
else:
break
else:
raise ValueError(f'Could not parse timestamp {date_string!r}'
f' with any of the formats {date_formats}')
return date(tm.tm_year, tm.tm_mon, tm.tm_mday)
def VMPdata_dtype_from_colIDs(colIDs): def VMPdata_dtype_from_colIDs(colIDs):
"""Get a numpy record type from a list of column ID numbers. """Get a numpy record type from a list of column ID numbers.
@@ -399,12 +419,7 @@ class MPRfile:
self.version = int(data_module['version']) self.version = int(data_module['version'])
self.cols = column_types self.cols = column_types
self.npts = n_data_points self.npts = n_data_points
self.startdate = parse_BioLogic_date(settings_mod['date'])
try:
tm = time.strptime(settings_mod['date'].decode('ascii'), '%m/%d/%y')
except ValueError:
tm = time.strptime(settings_mod['date'].decode('ascii'), '%m-%d-%y')
self.startdate = date(tm.tm_year, tm.tm_mon, tm.tm_mday)
if maybe_loop_module: if maybe_loop_module:
loop_module, = maybe_loop_module loop_module, = maybe_loop_module
@@ -418,11 +433,7 @@ class MPRfile:
if maybe_log_module: if maybe_log_module:
log_module, = maybe_log_module log_module, = maybe_log_module
try: self.enddate = parse_BioLogic_date(log_module['date'])
tm = time.strptime(log_module['date'].decode('ascii'), '%m/%d/%y')
except ValueError:
tm = time.strptime(log_module['date'].decode('ascii'), '%m-%d-%y')
self.enddate = date(tm.tm_year, tm.tm_mon, tm.tm_mday)
# There is a timestamp at either 465 or 469 bytes # There is a timestamp at either 465 or 469 bytes
# I can't find any reason why it is one or the other in any # I can't find any reason why it is one or the other in any

View File

@@ -6,7 +6,7 @@
import os.path import os.path
import re import re
from datetime import datetime from datetime import date, datetime
import numpy as np import numpy as np
from numpy.testing import assert_array_almost_equal, assert_array_equal from numpy.testing import assert_array_almost_equal, assert_array_equal
@@ -77,6 +77,24 @@ def test_colID_to_dtype(colIDs, expected):
assert dtype == expected_dtype assert dtype == expected_dtype
@pytest.mark.parametrize('data, expected', [
('02/23/17', date(2017, 2, 23)),
('10-03-05', date(2005, 10, 3)),
('11.12.20', date(2020, 11, 12)),
(b'01/02/03', date(2003, 1, 2)),
('13.08.07', ValueError),
('03-04/05', ValueError),
])
def test_parse_BioLogic_date(data, expected):
"""Test the parse_BioLogic_date function."""
if isinstance(expected, type) and issubclass(expected, Exception):
with pytest.raises(expected):
BioLogic.parse_BioLogic_date(data)
return
result = BioLogic.parse_BioLogic_date(data)
assert result == expected
@pytest.mark.parametrize('filename, startdate, enddate', [ @pytest.mark.parametrize('filename, startdate, enddate', [
('bio_logic1.mpr', '2011-10-29', '2011-10-31'), ('bio_logic1.mpr', '2011-10-29', '2011-10-31'),
('bio_logic2.mpr', '2012-09-27', '2012-09-27'), ('bio_logic2.mpr', '2012-09-27', '2012-09-27'),