From 719246b3c82d972ebfccbddfe6661c84eda7bb6d Mon Sep 17 00:00:00 2001 From: Andrew MacDonald Date: Tue, 8 Aug 2017 19:24:42 +1000 Subject: [PATCH] Fix #16: Ensure that irr data doesn't lose datetime precision Signed-off-by: Andrew MacDonald --- phildb/writer.py | 3 +++ tests/test_writer.py | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/phildb/writer.py b/phildb/writer.py index 48b8f1f..61c76e3 100644 --- a/phildb/writer.py +++ b/phildb/writer.py @@ -238,6 +238,9 @@ def write_irregular_data(tsdb_file, series): """ existing = __read(tsdb_file) + if series.dtype == np.float32: + series = series.astype(np.float64) + overlap_idx = existing.index.intersection(series.index) modified = series.ix[overlap_idx] != existing.value.ix[overlap_idx] records_to_modify = existing.loc[overlap_idx].ix[modified.values] diff --git a/tests/test_writer.py b/tests/test_writer.py index 2d70fc9..61dcc13 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -548,3 +548,28 @@ def test_empty_series_write(self): log_entries = writer.write(self.tsdb_existing_file, pd.Series([]), 'D') self.assertEqual(0, len(log_entries['C'])) self.assertEqual(0, len(log_entries['U'])) + + def test_float32_irregular_write(self): + """ + Test irregular write of float32 data. + + See: https://github.com/amacd31/phildb/issues/16 + """ + + sample = pd.Series( + pd.np.array( + [x + 0.1 for x in range(10)], + dtype=pd.np.float32 + ), + index=pd.date_range( + '2017-08-06 06:50:00+00:00', + periods=10, + freq='1T' + ) + ) + + log_entries = writer.write(self.tsdb_existing_file, sample, 'IRR') + data = reader.read(self.tsdb_existing_file) + + self.assertEqual(datetime(2017,8,6,6,50,0,0), data.index[0].to_pydatetime()) + self.assertEqual(datetime(2017,8,6,6,51,0,0), data.index[1].to_pydatetime())