InfluxdbAlchemy Zugriff auf Messungen mit Leerzeichen im Namen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
Dennis89
User
Beiträge: 1733
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo zusammen,

ich habe mal wieder Probleme und bitte euch im Hilfe.
Es gibt eine Datenbank (InfluxDB) in der befinden sich unterschiedliche Messungen. Einzelne würde ich gerne abfragen und nutze dazu InfluxAlchemy:
https://pypi.org/project/influxalchemy/

Folgender Code habe ich zum testen:

Code: Alles auswählen

import influxalchemy
import influxdb
import pandas as pd



class Dewetron(influxalchemy.Measurement):
    __measurement__ = "dewetron"


class SPS(influxalchemy.Measurement):
    __measurement__ = "Sensors"

def get_sensor_values():
    with influxdb.DataFrameClient(database="ABC50")as client:
        influx = influxalchemy.InfluxAlchemy(client)
        print(influx.fields(Dewetron))
        data = influx.query(SPS.BP005).execute()
        print(data)
`influx.fields()`gibt mir eine Liste aus, mit den Messungen, von denen ich gerne einzelne anhand ihrer Namen abfragen würde:
['Kühlwassertemperatur 1. Stufe', 'Kühlwassertemperatur 2. Stufe', ...]

`influx.query()` funktioniert so, wie in dem Code. Man gibt den Name der Messung als Attribut der Klasse an. Ich habe allerdings Leerzeichen in meinen Namen und finde nirgends einen Hinweis, wie damit umgegangen wird. Auch im Quellcode (https://github.com/amancevice/influxalchemy/tree/main) habe ich nichts gefunden.

Letztendlich ist das Ziel eine Webapp, darin will ich die gewünschten Messungen auswählen einen Zeitrahmen angeben und als Ergebnis hätte ich die gewählten Daten gerne in einer *.csv-Datei.

Könnt ihr mir bitte bei der Datenbankabfrage auf die Sprünge helfen? Ich nehme auch gerne eine andere Bibliothek, falls ihr eine bessere Idee habt.


Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
noisefloor
User
Beiträge: 4317
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

lass' dir doch mal nach Instanzierung der Klasse `sps = SPS()` die Attribute und Methoden mit `dir(sps)` ausgeben. Da solltest du sehen, wie die heißen.

BTW: bei influxalchemy ist seit etwas mehr als 2 Jahren nichts passiert und als Homepage bei PyPi ist ein Link auf die Githubseiten von KnackHQ (was auch immer das ist...). Weiß nicht, ob ich auf die Bilbliothek ein Projekt drauf setzen würde.

Gruß, noisefloor
Benutzeravatar
Dennis89
User
Beiträge: 1733
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort.
Mit `KnackHQ` war ich auch etwas verwirrt und habe es dann ohne gelöst:

Code: Alles auswählen

def get_sensor_values(date_range):
    with influxdb.DataFrameClient(database="ABC50") as client:
        parameters = {'start_date': date_range[0], 'end_date': date_range[1]}
        for sensor, measurements in EXPORT_VALUES.items():            
            query_string = f'SELECT {",".join(measurement[1] for measurement in measurements)} FROM {sensor} WHERE time >= $start_date and time <= $end_date;'
            result = client.query(query_string, bind_params=parameters, dropna=True)
Das Konstrukt mit `measurements` wird gerade noch überarbeitet.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14378
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Randbemerkung: Bei der WHERE-Bedingung würde sich BETWEEN anbieten:

Code: Alles auswählen

... WHERE time BETWEEN $start_date AND $end_date
Who is General Failure and why is he reading my hard disk?
Benutzeravatar
Dennis89
User
Beiträge: 1733
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für den Hinweis.
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1733
Registriert: Freitag 11. Dezember 2020, 15:13

Gerade ist noch ein Problem aufgetaucht.

Der Code ist noch ziemlich gleich:

Code: Alles auswählen

def get_sensor_values(start, end):
    with influxdb.DataFrameClient(database="ABC50", timeout=None) as client:
        parameters = {'start_date': start, 'end_date': end}
        points = []
        for sensors, measurements in EXPORT_VALUES.items():
            query_string = f'SELECT {",".join(measurement[1] for measurement in measurements)} FROM {sensors} WHERE time>= $start_date and time<= $end_date;'
            result = client.query(query_string, bind_params=parameters, dropna=True)
            if result:
                points.append(result[sensors])
    if not points:
        return pd.DataFrame()
    data = pd.concat(points, ignore_index=False, sort=False)
Fehlermeldung:

Code: Alles auswählen

Apr 17 10:38:11 engineering gunicorn[56594]: Internal Server Error: /export/export/
Apr 17 10:38:11 engineering gunicorn[56594]: Traceback (most recent call last):
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
Apr 17 10:38:11 engineering gunicorn[56594]:     response = get_response(request)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
Apr 17 10:38:11 engineering gunicorn[56594]:     response = wrapped_callback(request, *callback_args, **callback_kwargs)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/opt/TWxWebsite/TWxWebsite/evaluation/views.py", line 109, in export_file
Apr 17 10:38:11 engineering gunicorn[56594]:     points_to_csv(get_sensor_values(start, end), index)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/opt/TWxWebsite/TWxWebsite/evaluation/views.py", line 80, in get_sensor_values
Apr 17 10:38:11 engineering gunicorn[56594]:     result = client.query(query_string, bind_params=parameters, dropna=True)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/influxdb/_dataframe_client.py", line 202, in query
Apr 17 10:38:11 engineering gunicorn[56594]:     return self._to_dataframe(results, dropna,
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/influxdb/_dataframe_client.py", line 222, in _to_dataframe
Apr 17 10:38:11 engineering gunicorn[56594]:     df.time = pd.to_datetime(df.time)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/pandas/core/tools/datetimes.py", line 1072, in to_datetime
Apr 17 10:38:11 engineering gunicorn[56594]:     values = convert_listlike(arg._values, format)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/pandas/core/tools/datetimes.py", line 435, in _convert_listlike_datetimes
Apr 17 10:38:11 engineering gunicorn[56594]:     return _array_strptime_with_fallback(arg, name, utc, format, exact, errors)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "/home/dennis/venv-Website/lib/python3.10/site-packages/pandas/core/tools/datetimes.py", line 469, in _array_strptime_with_fallback
Apr 17 10:38:11 engineering gunicorn[56594]:     result, tz_out = array_strptime(arg, fmt, exact=exact, errors=errors, utc=utc)
Apr 17 10:38:11 engineering gunicorn[56594]:   File "pandas/_libs/tslibs/strptime.pyx", line 501, in pandas._libs.tslibs.strptime.array_strptime
Apr 17 10:38:11 engineering gunicorn[56594]:   File "pandas/_libs/tslibs/strptime.pyx", line 451, in pandas._libs.tslibs.strptime.array_strptime
Apr 17 10:38:11 engineering gunicorn[56594]:   File "pandas/_libs/tslibs/strptime.pyx", line 583, in pandas._libs.tslibs.strptime._parse_with_format
Apr 17 10:38:11 engineering gunicorn[56594]: ValueError: time data "2026-03-15T02:52:26Z" doesn't match format "%Y-%m-%dT%H:%M:%S.%f%z", at position 5160. You might want to try:
Apr 17 10:38:11 engineering gunicorn[56594]:     - passing `format` if your strings have a consistent format;
Apr 17 10:38:11 engineering gunicorn[56594]:     - passing `format='ISO8601'` if your strings are all ISO8601 but not necessarily in exactly the same format;
Apr 17 10:38:11 engineering gunicorn[56594]:     - passing `format='mixed'`, and the format will be inferred for each element individually. You might want to use `dayfirst` alongside this.
Ich gebe nirgends das Format `%Y-%m-%dT%H:%M:%S.%f%z`an. Das wird nach meinem Verständnis irgendwo intern gemacht. Wo setze ich das richtige und wie würde das aussehen?
Ich bin mal durch die Datenbank und der Großteil der Zeitstempel treffen auf das Format zu. Der ganze April funktioniert, im März habe ich diesen Zeitstempel in dem das `.%f`fehlt. Wenn das nur ein "Ausrutscher wäre, würde ich den einfach löschen. Allerdings will ich den Fehler in Zukunft vermeiden und daher am besten gleich richtig damit umgehen.

Habt ihr eine Idee?

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten