Added support for parsing out the timestamp

The timestamp is in the LOG module, at an offset of either 465 or
469. There is no obvious marker for which files have it at 465 and
which at 469.
This commit is contained in:
Chris Kerr
2013-12-11 22:21:50 +00:00
parent de84f9dd40
commit 34440068a7
2 changed files with 46 additions and 9 deletions

View File

@@ -7,7 +7,7 @@ import re
import csv import csv
from os import SEEK_SET, SEEK_CUR from os import SEEK_SET, SEEK_CUR
import time import time
from datetime import date from datetime import date, datetime, timedelta
from collections import OrderedDict from collections import OrderedDict
from warnings import warn from warnings import warn
@@ -261,3 +261,24 @@ class MPRfile:
tm = time.strptime(str(log_module['date'], encoding='ascii'), tm = time.strptime(str(log_module['date'], encoding='ascii'),
'%m/%d/%y') '%m/%d/%y')
self.enddate = date(tm.tm_year, tm.tm_mon, tm.tm_mday) self.enddate = date(tm.tm_year, tm.tm_mon, tm.tm_mday)
## 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
## given file
ole_timestamp1 = np.fromstring(log_module['data'][465:],
dtype='<f8', count=1)
ole_timestamp2 = np.fromstring(log_module['data'][469:],
dtype='<f8', count=1)
if ole_timestamp1 > 40000 and ole_timestamp1 < 50000:
ole_timestamp = ole_timestamp1
elif ole_timestamp2 > 40000 and ole_timestamp2 < 50000:
ole_timestamp = ole_timestamp2
ole_base = datetime(1899, 12, 30, tzinfo=None)
ole_timedelta = timedelta(days=ole_timestamp[0])
self.timestamp = ole_base + ole_timedelta
if self.startdate != self.timestamp.date():
raise ValueError("""Date mismatch:
Start date: %s
End date: %s
Timestamp: %s""" % (self.startdate, self.enddate, self.timestamp))

View File

@@ -2,7 +2,7 @@
import os.path import os.path
import re import re
from datetime import date 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
@@ -89,7 +89,17 @@ def test_open_MPR_fails_for_bad_file():
mpr1 = MPRfile(os.path.join(testdata_dir, 'arbin1.res')) mpr1 = MPRfile(os.path.join(testdata_dir, 'arbin1.res'))
def assert_MPR_matches_MPT(mpr, mpt): def timestamp_from_comments(comments):
for line in comments:
time_match = re.match(b'Acquisition started on : ([0-9/]+ [0-9:]+)', line)
if time_match:
timestamp = datetime.strptime(str(time_match.group(1), encoding='ascii'),
'%m/%d/%Y %H:%M:%S')
return timestamp
raise AttributeError("No timestamp in comments")
def assert_MPR_matches_MPT(mpr, mpt, comments):
def assert_field_matches(fieldname, decimal): def assert_field_matches(fieldname, decimal):
if fieldname in mpr.dtype.fields: if fieldname in mpr.dtype.fields:
@@ -132,18 +142,24 @@ def assert_MPR_matches_MPT(mpr, mpt):
assert_field_exact("cycle number") assert_field_exact("cycle number")
assert_field_matches("(Q-Qo)/C", decimal=6) # 32 bit float precision assert_field_matches("(Q-Qo)/C", decimal=6) # 32 bit float precision
try:
eq_(timestamp_from_comments(comments), mpr.timestamp)
except AttributeError:
pass
def test_MPR1_matches_MPT1(): def test_MPR1_matches_MPT1():
mpr1 = MPRfile(os.path.join(testdata_dir, 'bio-logic1.mpr')) mpr1 = MPRfile(os.path.join(testdata_dir, 'bio-logic1.mpr'))
mpt1, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic1.mpt')) mpt1, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic1.mpt'))
assert_MPR_matches_MPT(mpr1, mpt1) assert_MPR_matches_MPT(mpr1, mpt1, comments)
def test_MPR2_matches_MPT2(): def test_MPR2_matches_MPT2():
mpr2 = MPRfile(os.path.join(testdata_dir, 'bio-logic2.mpr')) mpr2 = MPRfile(os.path.join(testdata_dir, 'bio-logic2.mpr'))
mpt2, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic2.mpt')) mpt2, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic2.mpt'))
assert_MPR_matches_MPT(mpr2, mpt2) assert_MPR_matches_MPT(mpr2, mpt2, comments)
## No bio-logic3.mpt file ## No bio-logic3.mpt file
@@ -152,7 +168,7 @@ def test_MPR2_matches_MPT2():
def test_MPR4_matches_MPT4(): def test_MPR4_matches_MPT4():
mpr4 = MPRfile(os.path.join(testdata_dir, 'bio-logic4.mpr')) mpr4 = MPRfile(os.path.join(testdata_dir, 'bio-logic4.mpr'))
mpt4, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic4.mpt')) mpt4, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic4.mpt'))
assert_MPR_matches_MPT(mpr4, mpt4) assert_MPR_matches_MPT(mpr4, mpt4, comments)
def test_MPR5_matches_MPT5(): def test_MPR5_matches_MPT5():
@@ -160,11 +176,11 @@ def test_MPR5_matches_MPT5():
mpt, comments = MPTfile((re.sub(b'\tXXX\t', b'\t0\t', line) for line in mpt, comments = MPTfile((re.sub(b'\tXXX\t', b'\t0\t', line) for line in
open(os.path.join(testdata_dir, 'bio-logic5.mpt'), open(os.path.join(testdata_dir, 'bio-logic5.mpt'),
mode='rb'))) mode='rb')))
assert_MPR_matches_MPT(mpr, mpt) assert_MPR_matches_MPT(mpr, mpt, comments)
def test_MPR6_matches_MPT6(): def test_MPR6_matches_MPT6():
mpr = MPRfile(os.path.join(testdata_dir, 'bio-logic6.mpr')) mpr = MPRfile(os.path.join(testdata_dir, 'bio-logic6.mpr'))
mpt, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic6.mpt')) mpt, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic6.mpt'))
mpr.data = mpr.data[:958] # .mpt file is incomplete mpr.data = mpr.data[:958] # .mpt file is incomplete
assert_MPR_matches_MPT(mpr, mpt) assert_MPR_matches_MPT(mpr, mpt, comments)