क्वेस्टडब से क्वेरी टाइमरीज मापदंडों के साथ पंडों का उपयोग करते हुए
मैं क्वेस्टडब से पंडास डेटाफ़्रेम के लिए समय डेटा लोड करने की कोशिश कर रहा हूं। मैं जैसे Postgres ड्राइवर का उपयोग करने की कोशिश कर रहा हूँ
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)})
लेकिन वापस मिल गया
DatabaseError: (psycopg2.DatabaseError) between/and parameters must be constants
LINE 1: ...etry where ts between '2020-12-24T16:00:00'::timestamp ...
मैंने BETWEEN के बजाय> और <का उपयोग करने का भी प्रयास किया
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)})
लेकिन फिर भी नसीब नहीं हुआ
DatabaseError: (psycopg2.DatabaseError) unsupported class
LINE 1: ... > '2020-06-24T16:00:00'::timestamp and ts < '2021-01-0...
यह मापदंडों के बिना काम करता है इसलिए यह पूरी तरह से गलत नहीं है लेकिन मैं यहां कुछ याद कर रहा हूं।
जवाब
QuestDb में पोस्टग्रेज ड्राइवर सपोर्ट है लेकिन पूर्ण SQL क्वेरी संगत नहीं है। कुछ बिट्स काम नहीं करते हैं, इसलिए जाहिरा तौर पर केवल स्थिरांक के साथ उपयोग किया जा सकता है। जब आप अजगर डेटाइम मापदंडों का उपयोग करते हैं तो वे '2020-06-24T16:00:00'::timestamp
क्वेरी में परिवर्तित हो जाते हैं जो क्वेस्टडब द्वारा समर्थित नहीं है
वर्कअराउंड स्ट्रिंग मापदंडों को पास करना और उन्हें क्वेरी में टाइमस्टैम्प में बदलना, कुछ इस तरह है
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")})
टिप्पणियों में उल्लिखित ट्रेंटन में भी ऐसा ही है।