Skip to content

Commit 53533d1

Browse files
authored
Merge pull request influxdata#367 from tzonghao/master
Fix DataFrameClient empty tag processing
2 parents 3e439a0 + a7c6440 commit 53533d1

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

influxdb/_dataframe_client.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,24 @@ def _convert_dataframe_to_lines(self,
283283
# If tag columns exist, make an array of formatted tag keys and values
284284
if tag_columns:
285285
tag_df = dataframe[tag_columns]
286+
tag_df = tag_df.fillna('') # replace NA with empty string
286287
tag_df = tag_df.sort_index(axis=1)
287288
tag_df = self._stringify_dataframe(
288289
tag_df, numeric_precision, datatype='tag')
289-
tags = (',' + (
290-
(tag_df.columns.values + '=').tolist() + tag_df)).sum(axis=1)
291-
del tag_df
292290

291+
# prepend tag keys
292+
tag_df = tag_df.apply(
293+
lambda s: s.apply(
294+
lambda v, l: l + '=' + v if v else None, l=s.name))
295+
296+
# join tags, but leave out None values
297+
tags = tag_df.apply(
298+
lambda r: ','.join(r.dropna()), axis=1)
299+
300+
# prepend comma
301+
tags = tags.apply(lambda v: ',' + v if v else '')
302+
303+
del tag_df
293304
else:
294305
tags = ''
295306

influxdb/tests/dataframe_client_test.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,20 +201,33 @@ def test_write_points_from_dataframe_with_tag_cols_and_defaults(self):
201201
def test_write_points_from_dataframe_with_tag_escaped(self):
202202
now = pd.Timestamp('1970-01-01 00:00+00:00')
203203
dataframe = pd.DataFrame(
204-
data=[['blue', 1, "1", 1, 1.0, 'hot'],
205-
['red,green=orange', 0, "2", 2, 2.0, 'cold']],
206-
index=[now, now + timedelta(hours=1)],
207-
columns=["tag_one", "tag_two", "column_one",
208-
"column_two", "column_three",
209-
"tag_three"])
204+
data=[
205+
['blue orange', "1", 1, 'hot=cold'], # space, equal
206+
['red,green', "2", 2, r'cold\fire'], # comma, backslash
207+
['some', "2", 2, ''], # skip empty
208+
['some', "2", 2, None], # skip None
209+
['', "2", 2, None], # all tags empty
210+
],
211+
index=pd.period_range(now, freq='H', periods=5),
212+
columns=["tag_one", "column_one", "column_two", "tag_three"]
213+
)
210214

211215
expected_escaped_tags = (
212-
b"foo,tag_one=blue "
216+
b"foo,tag_one=blue\\ orange,tag_three=hot\\=cold "
213217
b"column_one=\"1\",column_two=1i "
214218
b"0\n"
215-
b"foo,tag_one=red\\,green\\=orange "
219+
b"foo,tag_one=red\\,green,tag_three=cold\\\\fire "
216220
b"column_one=\"2\",column_two=2i "
217221
b"3600000000000\n"
222+
b"foo,tag_one=some "
223+
b"column_one=\"2\",column_two=2i "
224+
b"7200000000000\n"
225+
b"foo,tag_one=some "
226+
b"column_one=\"2\",column_two=2i "
227+
b"10800000000000\n"
228+
b"foo "
229+
b"column_one=\"2\",column_two=2i "
230+
b"14400000000000\n"
218231
)
219232

220233
with requests_mock.Mocker() as m:
@@ -224,7 +237,7 @@ def test_write_points_from_dataframe_with_tag_escaped(self):
224237
cli = DataFrameClient(database='db')
225238
cli.write_points(dataframe, 'foo',
226239
field_columns=['column_one', 'column_two'],
227-
tag_columns=['tag_one'])
240+
tag_columns=['tag_one', 'tag_three'])
228241
self.assertEqual(m.last_request.body, expected_escaped_tags)
229242

230243
def test_write_points_from_dataframe_with_numeric_column_names(self):

0 commit comments

Comments
 (0)