Округление до десятых, прежде чем запрашивать базу - PullRequest
0 голосов
/ 05 января 2019

Я использую 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, до запроса к базе данных?

...