Skip to content

Commit 0502fa2

Browse files
committed
Merge pull request influxdata#93 from tzonghao/master
Add time_precision option to datetime_to_epoch. (Thanks @tzonghao)
2 parents cd28c36 + 5d5c2f2 commit 0502fa2

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

influxdb/misc.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def write_points(self, data, *args, **kwargs):
3232
"""
3333

3434
batch_size = kwargs.get('batch_size')
35+
time_precision = kwargs.get('time_precision', 's')
3536
if batch_size:
3637
kwargs.pop('batch_size') # don't hand over to InfluxDBClient
3738
for key, data_frame in data.items():
@@ -42,14 +43,15 @@ def write_points(self, data, *args, **kwargs):
4243
end_index = (batch + 1) * batch_size
4344
data = [self._convert_dataframe_to_json(
4445
name=key,
45-
dataframe=data_frame.ix[start_index:end_index].copy())]
46+
dataframe=data_frame.ix[start_index:end_index].copy(),
47+
time_precision=time_precision)]
4648
InfluxDBClient.write_points_with_precision(self, data,
4749
*args, **kwargs)
4850
return True
4951
else:
50-
data = [self._convert_dataframe_to_json(name=key,
51-
dataframe=dataframe)
52-
for key, dataframe in data.items()]
52+
data = [self._convert_dataframe_to_json(
53+
name=key, dataframe=dataframe, time_precision=time_precision)
54+
for key, dataframe in data.items()]
5355
return InfluxDBClient.write_points_with_precision(self, data,
5456
*args, **kwargs)
5557

@@ -105,7 +107,7 @@ def _to_dataframe(self, json_result, time_precision):
105107
del dataframe['time']
106108
return dataframe
107109

108-
def _convert_dataframe_to_json(self, dataframe, name):
110+
def _convert_dataframe_to_json(self, dataframe, name, time_precision='s'):
109111
try:
110112
import pandas as pd
111113
except ImportError:
@@ -120,12 +122,18 @@ def _convert_dataframe_to_json(self, dataframe, name):
120122
dataframe.index = dataframe.index.to_datetime()
121123
if dataframe.index.tzinfo is None:
122124
dataframe.index = dataframe.index.tz_localize('UTC')
123-
dataframe['time'] = [self._datetime_to_epoch(dt)
125+
dataframe['time'] = [self._datetime_to_epoch(dt, time_precision)
124126
for dt in dataframe.index]
125127
data = {'name': name,
126128
'columns': [str(column) for column in dataframe.columns],
127129
'points': list([list(x) for x in dataframe.values])}
128130
return data
129131

130-
def _datetime_to_epoch(self, datetime):
131-
return (datetime - DataFrameClient.EPOCH).total_seconds()
132+
def _datetime_to_epoch(self, datetime, time_precision='s'):
133+
seconds = (datetime - DataFrameClient.EPOCH).total_seconds()
134+
if time_precision == 's':
135+
return seconds
136+
elif time_precision == 'm':
137+
return seconds * 1000
138+
elif time_precision == 'u':
139+
return seconds * 1000000

tests/influxdb/misc_test.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from nose.tools import raises
99
from datetime import timedelta
1010
from tests import skipIfPYpy, using_pypy
11+
import copy
1112

1213
if not using_pypy:
1314
import pandas as pd
@@ -111,6 +112,44 @@ def test_write_points_from_dataframe_with_period_index(self):
111112

112113
self.assertListEqual(json.loads(m.last_request.body), points)
113114

115+
def test_write_points_from_dataframe_with_time_precision(self):
116+
now = pd.Timestamp('1970-01-01 00:00+00:00')
117+
dataframe = pd.DataFrame(data=[["1", 1, 1.0], ["2", 2, 2.0]],
118+
index=[now, now + timedelta(hours=1)],
119+
columns=["column_one", "column_two",
120+
"column_three"])
121+
points = [
122+
{
123+
"points": [
124+
["1", 1, 1.0, 0],
125+
["2", 2, 2.0, 3600]
126+
],
127+
"name": "foo",
128+
"columns": ["column_one", "column_two", "column_three", "time"]
129+
}
130+
]
131+
132+
points_ms = copy.deepcopy(points)
133+
points_ms[0]["points"][1][-1] = 3600 * 1000
134+
135+
points_us = copy.deepcopy(points)
136+
points_us[0]["points"][1][-1] = 3600 * 1000000
137+
138+
with requests_mock.Mocker() as m:
139+
m.register_uri(requests_mock.POST,
140+
"http://localhost:8086/db/db/series")
141+
142+
cli = DataFrameClient(database='db')
143+
144+
cli.write_points({"foo": dataframe}, time_precision='s')
145+
self.assertListEqual(json.loads(m.last_request.body), points)
146+
147+
cli.write_points({"foo": dataframe}, time_precision='m')
148+
self.assertListEqual(json.loads(m.last_request.body), points_ms)
149+
150+
cli.write_points({"foo": dataframe}, time_precision='u')
151+
self.assertListEqual(json.loads(m.last_request.body), points_us)
152+
114153
@raises(TypeError)
115154
def test_write_points_from_dataframe_fails_without_time_index(self):
116155
dataframe = pd.DataFrame(data=[["1", 1, 1.0], ["2", 2, 2.0]],

0 commit comments

Comments
 (0)