क्वेस्टडब से क्वेरी टाइमरीज मापदंडों के साथ पंडों का उपयोग करते हुए

Jan 13 2021

मैं क्वेस्टडब से पंडास डेटाफ़्रेम के लिए समय डेटा लोड करने की कोशिश कर रहा हूं। मैं जैसे 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...

यह मापदंडों के बिना काम करता है इसलिए यह पूरी तरह से गलत नहीं है लेकिन मैं यहां कुछ याद कर रहा हूं।

जवाब

4 AlexdesPelagos Jan 13 2021 at 05:40

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")})

टिप्पणियों में उल्लिखित ट्रेंटन में भी ऐसा ही है।