SQLAlchemy группа с интервалом 30 минут - PullRequest
0 голосов
/ 06 ноября 2019

Я довольно новичок в 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"

1 Ответ

2 голосов
/ 06 ноября 2019

Во-первых, мы должны выяснить, как это сделать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...