Skip to content

Commit aa49182

Browse files
committed
feat: support for writing pandas DataFrame (#79) - default tags
1 parent 212cee3 commit aa49182

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

influxdb_client/client/write_api.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -306,42 +306,46 @@ def _write_batching(self, bucket, org, data,
306306

307307
return None
308308

309-
def _data_frame_to_list_of_points(self, dataframe, data_frame_measurement_name, data_frame_tag_columns, precision='s'):
309+
def _data_frame_to_list_of_points(self, data_frame, data_frame_measurement_name, data_frame_tag_columns, precision):
310310
from ..extras import pd
311-
if not isinstance(dataframe, pd.DataFrame):
311+
if not isinstance(data_frame, pd.DataFrame):
312312
raise TypeError('Must be DataFrame, but type was: {0}.'
313-
.format(type(dataframe)))
314-
if not (isinstance(dataframe.index, pd.PeriodIndex) or
315-
isinstance(dataframe.index, pd.DatetimeIndex)):
313+
.format(type(data_frame)))
314+
if not (isinstance(data_frame.index, pd.PeriodIndex) or
315+
isinstance(data_frame.index, pd.DatetimeIndex)):
316316
raise TypeError('Must be DataFrame with DatetimeIndex or \
317317
PeriodIndex.')
318318

319-
if isinstance(dataframe.index, pd.PeriodIndex):
320-
dataframe.index = dataframe.index.to_timestamp()
319+
if isinstance(data_frame.index, pd.PeriodIndex):
320+
data_frame.index = data_frame.index.to_timestamp()
321321
else:
322-
dataframe.index = pd.to_datetime(dataframe.index)
322+
data_frame.index = pd.to_datetime(data_frame.index)
323323

324-
if dataframe.index.tzinfo is None:
325-
dataframe.index = dataframe.index.tz_localize('UTC')
324+
if data_frame.index.tzinfo is None:
325+
data_frame.index = data_frame.index.tz_localize('UTC')
326326

327327
data = []
328328

329329
c = 0
330-
for v in dataframe.values:
330+
for v in data_frame.values:
331331
point = Point(measurement_name=data_frame_measurement_name)
332332

333333
count = 0
334334
for f in v:
335-
column = dataframe.columns[count]
335+
column = data_frame.columns[count]
336336
if data_frame_tag_columns and column in data_frame_tag_columns:
337337
point.tag(column, f)
338338
else:
339339
point.field(column, f)
340340
count += 1
341341

342-
point.time(dataframe.index[c], precision)
342+
point.time(data_frame.index[c], precision)
343343
c += 1
344344

345+
if self._point_settings.defaultTags:
346+
for key, val in self._point_settings.defaultTags.items():
347+
point.tag(key, val)
348+
345349
data.append(point)
346350

347351
return data

tests/test_WriteApi.py

+38
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,44 @@ def test_use_default_tags_with_dictionaries(self):
398398

399399
self.delete_test_bucket(bucket)
400400

401+
def test_use_default_tags_with_data_frame(self):
402+
from influxdb_client.extras import pd
403+
404+
bucket = self.create_test_bucket()
405+
406+
now = pd.Timestamp('1970-01-01 00:00+00:00')
407+
data_frame = pd.DataFrame(data=[["coyote_creek", 1.0], ["coyote_creek", 2.0]],
408+
index=[now + timedelta(hours=1), now + timedelta(hours=2)],
409+
columns=["location", "water_level"])
410+
411+
self.write_client.write(bucket.name, record=data_frame, data_frame_measurement_name='h2o_feet',
412+
data_frame_tag_columns=['location'])
413+
414+
time.sleep(1)
415+
416+
query = 'from(bucket:"' + bucket.name + '") |> range(start: 1970-01-01T00:00:00.000000001Z)'
417+
418+
flux_result = self.client.query_api().query(query)
419+
420+
self.assertEqual(1, len(flux_result))
421+
422+
records = flux_result[0].records
423+
424+
self.assertEqual(2, len(records))
425+
426+
rec = records[0]
427+
rec2 = records[1]
428+
429+
self.assertEqual(self.id_tag, rec["id"])
430+
self.assertEqual(self.customer_tag, rec["customer"])
431+
self.assertEqual("LA", rec[self.data_center_key])
432+
433+
self.assertEqual(self.id_tag, rec2["id"])
434+
self.assertEqual(self.customer_tag, rec2["customer"])
435+
self.assertEqual("LA", rec2[self.data_center_key])
436+
437+
self.delete_test_bucket(bucket)
438+
401439
def test_write_bytes(self):
402440
bucket = self.create_test_bucket()
403441

0 commit comments

Comments
 (0)