Fragen Sie Zeitreihen von QuestDb mit Pandas mit Parametern ab
Ich versuche, Zeitreihendaten von QuestDb in Pandas Dataframe zu laden. Ich versuche, Postgres-Treiber wie zu verwenden
import pandas as pd
from sqlalchemy import create_engine
from datetime import datetime
engine = create_engine('postgresql://admin:quest@localhost:8812/mydb')
df = pd.read_sql_query(
"select * from cases where ts between %(dstart)s and %(dfinish)s",
con=engine,
params={"dstart":datetime(2020,12,24,16,0),"dfinish":datetime(2021,1,1,0,0)})
Aber bin zurückgekommen
DatabaseError: (psycopg2.DatabaseError) between/and parameters must be constants
LINE 1: ...etry where ts between '2020-12-24T16:00:00'::timestamp ...
Ich habe auch versucht,> und <anstelle von ZWISCHEN zu verwenden
df = pd.read_sql_query(
"select * from cases where ts > %(dstart)s and ts < %(dfinish)s",
con=engine,
params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)})
Aber immer noch kein Glück
DatabaseError: (psycopg2.DatabaseError) unsupported class
LINE 1: ... > '2020-06-24T16:00:00'::timestamp and ts < '2021-01-0...
Es funktioniert ohne Parameter, also ist es nicht ganz falsch, aber ich vermisse hier etwas.
Antworten
QuestDb unterstützt Postgres-Treiber, ist jedoch nicht vollständig mit SQL-Abfragen kompatibel. Nur wenige Bits funktionieren nicht, so dass ZWISCHEN anscheinend nur mit Konstanten verwendet werden können. Wenn Sie Python-Datetime-Parameter verwenden, werden diese '2020-06-24T16:00:00'::timestamp
in der Abfrage konvertiert, die auch von QuestDb nicht unterstützt wird
Die Problemumgehung besteht darin, Zeichenfolgenparameter zu übergeben und sie in der Abfrage selbst in einen Zeitstempel zu konvertieren
df = pd.read_sql_query(
"select * from cases where ts > to_timestamp(%(dstart)s, 'yyyy-MM-dd HH:mm:ss') " +
"and ts < to_timestamp(%(dfinish)s, 'yyyy-MM-dd HH:mm:ss')",
con=engine,
params={"dstart":datetime(2020,12,24,16,0).strftime("%Y-%m-%d %H:%M:%S"),
"dfinish":datetime(2021,6,24,17,0).strftime("%Y-%m-%d %H:%M:%S")})
Das ist das gleiche wie in dem in den Kommentaren erwähnten Trenton.