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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy