首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带参数的Pandas从QuestDb查询时间序列

使用带参数的Pandas从QuestDb查询时间序列
EN

Stack Overflow用户
提问于 2021-01-13 00:45:25
回答 1查看 251关注 0票数 1

我正在尝试将时间序列数据从QuestDb加载到Pandas Dataframe。我正在尝试使用Postgres驱动,如下所示

代码语言:javascript
复制
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)})

但是回来了

代码语言:javascript
复制
DatabaseError: (psycopg2.DatabaseError) between/and parameters must be constants
LINE 1: ...etry where ts between '2020-12-24T16:00:00'::timestamp ...

我还尝试使用>和<而不是介于两者之间

代码语言:javascript
复制
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)})

但还是不走运

代码语言:javascript
复制
DatabaseError: (psycopg2.DatabaseError) unsupported class
LINE 1: ... > '2020-06-24T16:00:00'::timestamp and ts < '2021-01-0...

它在没有参数的情况下工作,所以它不是完全错误的,但我在这里遗漏了一些东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 06:40:51

QuestDb支持Postgres驱动程序,但不完全兼容SQL查询。有几位不起作用,所以BETWEEN显然只能与常量一起使用。此外,当您使用python日期时间参数时,它们会在查询中转换为QuestDb不支持的'2020-06-24T16:00:00'::timestamp

解决方法是传递字符串参数,并在查询本身中将它们转换为时间戳,如下所示

代码语言:javascript
复制
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")})

这与评论中提到的Trenton是一样的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65688218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档