【问题标题】:SQLAlchemy group by interval 30 minsSQLAlchemy 组按间隔 30 分钟
【发布时间】:2020-03-03 02:43:27
【问题描述】:

我是 Python 和 SQL Alchemy 的新手,我有一个关于我正在尝试执行的查询的问题。

更具体地说,我有这个数据列表。它每 5 分钟包含一些措施。 我想做的是按时间戳分组,基于 30 分钟,所以当:

  • 00:15:00+00 -> 00:00:00+00
  • 00:20:00+00 -> 00:00:00+00
  • 00:30:00+00 -> 00:30:00+00
  • 00:35:00+00 -> 00:30:00+00

然后聚合关于该值的数据。

现在我有以下代码:

base_query = (
        db.query(
            MyTable.timestamp,
            func.max(MyTable.dual).label("max"),
            func.min(MyTable.dual).label("min"),
            func.avg(MyTable.dual).label("avg"),
            func.count(MyTable.id).label("count"),
        )
        .join(Simulation, Simulation.id == MyTable.simulation_id)
        .filter(
            and_(MyTable.dual > 0, Simulation.scenario_id == scenario_id)
        )
        .group_by(MyTable.timestamp)
        .order_by(MyTable.timestamp)
    )
timestamp                   count   avg
"2020-01-13 00:00:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:05:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:10:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:15:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:20:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:25:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:30:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:35:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:40:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:45:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:50:00+00"    "10"    "6454.70683325249"
"2020-01-13 00:55:00+00"    "10"    "6454.70683325249"
"2020-01-13 01:00:00+00"    "10"    "6454.70683325249"
"2020-01-13 01:05:00+00"    "10"    "6454.70683325249"
"2020-01-13 01:10:00+00"    "10"    "6454.70683325249"
"2020-01-13 01:15:00+00"    "10"    "6454.70683325249"

【问题讨论】:

标签: python postgresql datetime sqlalchemy


【解决方案1】:

首先,我们必须弄清楚如何在 sql 中做到这一点。获得半小时间隔 应该不会太难:

select 1800*(floor(unix_timestamp(timestamp)/1800))

您可能希望将其转换回日期时间,但恐怕不是 足够便携。在 mysql 中你可以使用 from_unixtime,但是如果你得到 unix 时间戳作为查询的结果,您可以轻松地将其转换为 在 python 中你想要的任何东西。

其次,如何在 sqlalchemy 中进行操作。看起来很漂亮 直截了当:

 import sqlalchemy
 from sqlalchemy import select, func
 q = select([
    (1800*func.floor(func.unix_timestamp(t.c.tm0)/1800)).label("tm_hh") 
 ]))
 print(q)
 # prints out this:
 # SELECT %s * floor(unix_timestamp(T.tm0) / %s) AS tm_hh \nFROM T

【讨论】:

  • 我收到此错误ERROR: function unix_timestamp(timestamp with time zone) does not exist
  • 对,我以为unix_timestamp是一个标准的sql函数。对于 postgress 这可能有效: SELECT extract(epoch FROM your_datetime_column) FROM your_table (via stackoverflow.com/questions/5857990/…)
猜你喜欢
  • 2021-07-16
  • 2019-09-28
  • 2012-04-06
  • 2016-03-24
  • 2019-04-12
  • 1970-01-01
  • 2023-02-20
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多