使用带参数的 Pandas 从 QuestDb 查询时间序列
Query timeseries from QuestDb using Pandas with parameters
我正在尝试将时间序列数据从 QuestDb 加载到 Pandas Dataframe。我正在尝试使用像
这样的 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 支持 Postgres 驱动程序,但不完全 SQL 查询兼容。很少有位不起作用,所以 BETWEEN 显然只能与常量一起使用。此外,当您使用 python 日期时间参数时,它们会在查询中转换为 '2020-06-24T16:00:00'::timestamp
,QuestDb
也不支持
解决方法是传递字符串参数并在查询本身中将它们转换为时间戳,例如
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")})
这与评论中提到的特伦顿相同。
我正在尝试将时间序列数据从 QuestDb 加载到 Pandas Dataframe。我正在尝试使用像
这样的 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 支持 Postgres 驱动程序,但不完全 SQL 查询兼容。很少有位不起作用,所以 BETWEEN 显然只能与常量一起使用。此外,当您使用 python 日期时间参数时,它们会在查询中转换为 '2020-06-24T16:00:00'::timestamp
,QuestDb
解决方法是传递字符串参数并在查询本身中将它们转换为时间戳,例如
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")})
这与评论中提到的特伦顿相同。