Я использую InfluxDB в качестве базы данных временных рядов. Довольно приятно играть с такой инфраструктурой. Однако я столкнулся с досадной проблемой, я не знаю, как ее решить. Кажется трудным запрашивать базу данных, когда она имеет точность менее секунды, потому что изменение во времени немного искажено. Первоначально я просил написать с точностью до 0,5 секунды, но я не получил такую точность в базе данных.
> select price from TSLA_0p5s limit 100
name: TSLA_0p5s
time midprice
---- --------
2015-07-15T09:00:00Z 267.1
2015-07-15T09:00:00.499500032Z 267.1
2015-07-15T09:00:01Z 267.1
2015-07-15T09:00:01.499500032Z 267.1
2015-07-15T09:00:02Z 267.1
2015-07-15T09:00:02.499500032Z 267.1
2015-07-15T09:00:03Z 267.1
2015-07-15T09:00:03.499500032Z 267.1
2015-07-15T09:00:04Z 267.1
2015-07-15T09:00:04.499500032Z 267.1
2015-07-15T09:00:05Z 267.1
2015-07-15T09:00:05.499500032Z 267.1
2015-07-15T09:00:06Z 267.1
2015-07-15T09:00:06.499500032Z 267.1
2015-07-15T09:00:07Z 267.1
2015-07-15T09:00:07.499500032Z 267.1
2015-07-15T09:00:08Z 267.1
2015-07-15T09:00:08.499500032Z 267.1
2015-07-15T09:00:09Z 267.1
2015-07-15T09:00:09.499500032Z 267.1
2015-07-15T09:00:10Z 267.1
2015-07-15T09:00:10.499500032Z 267.1
2015-07-15T09:00:11Z 267.1
2015-07-15T09:00:11.499500032Z 267.1
2015-07-15T09:00:12Z 267.1
2015-07-15T09:00:12.499500032Z 267.1
В приведенном выше примере из базы данных вы можете видеть, что различия между временными метками не являются регулярными. Когда я записывал данные в базу данных с помощью influenxdb-python , timedelta была уникальной и имела значение 0,5 секунды. Здесь вы можете заметить, что
2015-07-15T09: 00: 00.499500032Z - 2015-07-15T09: 00: 00Z = 0,49950032 секунды (**)
и
2015-07-15T09: 00: 01Z - 2015-07-15T09: 00: 00.499500032Z = 0,50049968
второй (***)
from influxdb import InfluxDBClient
client = InfluxDBClient("localhost", 8086, username, password, "data")
delta_intraday = timedelta(seconds=0.5)
current_time = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
next_time = current_time + delta_intraday
start_time = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
end_time = datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
def generateDataFromDb():
while next_time < end_time:
fetch_items = client.query(
"select * from "
+ DB_NAME
+ " WHERE time >= '"
+ current_time.isoformat().replace("T", " ")
+ "' AND time <= '"
+ next_time.isoformat().replace("T", " ")
+ "';"
)
fetch_points = fetch_items.get_points()
data = []
data.extend(ts_fetch_items_gen(fetch_points))
data = np.array(data)
data = ts_extract(data, keys)
yield np.array(data)
current_time = next_time
next_time = next_time + delta_intraday
dataGenerator = generateDataFromDb(FROM_DAY, TO_DAY, delta=1)
for i, data in enumerate(dataGenerator):
print("{}- The datashape is {}".format(i, data.shape))
Здесь не беспокойтесь о ts_fetch_items_gen()
и ts_extract()
.
Выход из вышеприведенного кода:
0- The datashape is (2, 103)
1- The datashape is (103,)
2- The datashape is (2, 103)
3- The datashape is (103,)
4- The datashape is (2, 103)
5- The datashape is (103,)
6- The datashape is (2, 103)
7- The datashape is (103,)
8- The datashape is (2, 103)
9- The datashape is (103,)
10- The datashape is (2, 103)
11- The datashape is (103,)
12- The datashape is (2, 103)
13- The datashape is (103,)
14- The datashape is (2, 103)
15- The datashape is (103,)
16- The datashape is (2, 103)
17- The datashape is (103,)
18- The datashape is (2, 103)
19- The datashape is (103,)
...
Из-за (**)
и (***)
я получил два разных типа данных в вышеприведенном выводе, то есть (103,)
и (2, 103)
.
Есть ли способ округлить временные метки до десятых, т. Е. 0.49950032 --> 0.5
, до запроса к базе данных?