Skip to content

Commit

Permalink
fix: serialization of dataframes with NaN values and columns starting…
Browse files Browse the repository at this point in the history
… with digits
  • Loading branch information
Dorssers, Frank committed Aug 8, 2022
1 parent 4537d21 commit b620f8c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
### Dependencies
1. [#472](https://github.com/influxdata/influxdb-client-python/pull/472): Update `RxPY` to `4.0.4`

### Bug Fixes
1. [#485](https://github.com/influxdata/influxdb-client-python/issues/485): Fix bug when serializing DataFrames that might occur if you're inserting NaN values and have columns starting with digits.

### Others
1. [#472](https://github.com/influxdata/influxdb-client-python/pull/472): Drop supports for Python 3.6

Expand Down
2 changes: 1 addition & 1 deletion influxdb_client/client/write/dataframe_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ def serialize(self, chunk_idx: int = None):
if self.first_field_maybe_null:
# When the first field is null (None/NaN), we'll have
# a spurious leading comma which needs to be removed.
lp = (re.sub('^(( |[^ ])* ),([a-zA-Z])(.*)', '\\1\\3\\4', self.f(p))
lp = (re.sub('^(( |[^ ])* ),([a-zA-Z0-9])(.*)', '\\1\\3\\4', self.f(p))
for p in filter(lambda x: _any_not_nan(x, self.field_indexes), _itertuples(chunk)))
return list(lp)
else:
Expand Down
33 changes: 33 additions & 0 deletions tests/test_WriteApiDataFrame.py
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,39 @@ def test_specify_timezone_period_time_index(self):
self.assertEqual('test value1=10i,value2=30i 1590307200000000000', points[0])
self.assertEqual('test value1=20i,value2=40i 1590310800000000000', points[1])

def test_serialization_for_nan_in_columns_starting_with_digits(self):
from influxdb_client.extras import pd
from influxdb_client.extras import np
data_frame = pd.DataFrame(data={
'1value': [np.nan, 30.0, np.nan, 30.0, np.nan],
'2value': [30.0, np.nan, np.nan, np.nan, np.nan],
'3value': [30.0, 30.0, 30.0, np.nan, np.nan],
'avalue': [30.0, 30.0, 30.0, 30.0, 30.0]
}, index=pd.period_range('2020-05-24 10:00', freq='H', periods=5))

points = data_frame_to_list_of_points(data_frame,
PointSettings(),
data_frame_measurement_name='test')

self.assertEqual(5, len(points))
self.assertEqual('test 2value=30.0,3value=30.0,avalue=30.0 1590314400000000000', points[0])
self.assertEqual('test 1value=30.0,3value=30.0,avalue=30.0 1590318000000000000', points[1])
self.assertEqual('test 3value=30.0,avalue=30.0 1590321600000000000', points[2])
self.assertEqual('test 1value=30.0,avalue=30.0 1590325200000000000', points[3])
self.assertEqual('test avalue=30.0 1590328800000000000', points[4])

data_frame = pd.DataFrame(data={
'1value': [np.nan],
'avalue': [30.0],
'bvalue': [30.0]
}, index=pd.period_range('2020-05-24 10:00', freq='H', periods=1))

points = data_frame_to_list_of_points(data_frame,
PointSettings(),
data_frame_measurement_name='test')
self.assertEqual(1, len(points))
self.assertEqual('test avalue=30.0,bvalue=30.0 1590314400000000000', points[0])


class DataSerializerChunksTest(unittest.TestCase):
def test_chunks(self):
Expand Down

0 comments on commit b620f8c

Please sign in to comment.