Skip to content

Commit 2ebf5a3

Browse files
committed
fix: Fixed serialization of DataFrame with empty (NaN) values #118
1 parent fe71d6f commit 2ebf5a3

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

influxdb_client/client/write/dataframe_serializer.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,18 @@ def data_frame_to_list_of_points(data_frame, point_settings, **kwargs):
7272
key_format = f'{{keys[{index}]}}'
7373

7474
if key in data_frame_tag_columns:
75-
tags.append(f"{key_format}={{str(p[{index + 1}]).translate(_ESCAPE_KEY)}}")
75+
tags.append({'key': key, 'value': f"{key_format}={{str(p[{index + 1}]).translate(_ESCAPE_KEY)}}"})
7676
elif issubclass(value.type, np.integer):
7777
fields.append(f"{key_format}={{p[{index + 1}]}}i")
7878
elif issubclass(value.type, (np.float, np.bool_)):
7979
fields.append(f"{key_format}={{p[{index + 1}]}}")
8080
else:
8181
fields.append(f"{key_format}=\"{{str(p[{index + 1}]).translate(_ESCAPE_KEY)}}\"")
8282

83-
fmt = (f'{{measurement_name}}', f'{"," if tags else ""}', ','.join(tags),
83+
tags.sort(key=lambda x: x['key'])
84+
tags = ','.join(map(lambda y: y['value'], tags))
85+
86+
fmt = (f'{{measurement_name}}', f'{"," if tags else ""}', tags,
8487
' ', ','.join(fields), ' {p[0].value}')
8588
f = eval("lambda p: f'{}'".format(''.join(fmt)),
8689
{'measurement_name': measurement_name, '_ESCAPE_KEY': _ESCAPE_KEY, 'keys': keys})
@@ -97,4 +100,4 @@ def data_frame_to_list_of_points(data_frame, point_settings, **kwargs):
97100
for p in _itertuples(data_frame))
98101
return list(lp)
99102
else:
100-
return list(map(f, _itertuples(data_frame)))
103+
return list(map(f, _itertuples(data_frame)))

tests/test_WriteApiDataFrame.py

+17
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,20 @@ def test_tag_escaping_key_and_value(self):
197197
self.assertEqual(
198198
"h\\n2\\ro\\t_data,carriage\\rreturn=carriage\\nreturn,new\\nline=new\\nline,t\\tab=t\\tab l\\ne\\rv\\tel=2i 1586048400000000000",
199199
points[0])
200+
201+
def test_tags_order(self):
202+
from influxdb_client.extras import pd, np
203+
204+
now = pd.Timestamp('2020-04-05 00:00+00:00')
205+
206+
data_frame = pd.DataFrame(data=[["c", "a", "b", np.int64(2)], ],
207+
index=[now + timedelta(hours=1), ],
208+
columns=["c", "a", "b", "level"])
209+
210+
points = data_frame_to_list_of_points(data_frame=data_frame,
211+
point_settings=PointSettings(),
212+
data_frame_measurement_name='h2o',
213+
data_frame_tag_columns={"c", "a", "b"})
214+
215+
self.assertEqual(1, len(points))
216+
self.assertEqual("h2o,a=a,b=b,c=c level=2i 1586048400000000000", points[0])

0 commit comments

Comments
 (0)