【问题标题】:Python SQL function, query to group dates by minutesPython SQL 函数,查询按分钟分组日期
【发布时间】:2012-02-29 13:07:14
【问题描述】:

我有一个 SQL 数据库,其中的行包含给定日期时间的 EUR/USD 价格:

我想将这些数据分成 1 分钟的组并获取一些信息,我编写了一个调用 sqlite3 数据库的 python 程序。现在,我有这个程序:

def SQLQuerySpecial(currency,start,end):
    sql = 'SELECT f.datetime, f.buy, c.minp, c.maxp, c.avgp FROM {c} f INNER JOIN (SELECT MIN(datetime) mindate, MAX(datetime) maxdate, MIN(sell) minp, MAX(sell) maxp, AVG(buy) avgp FROM {c} GROUP BY strftime("%Y-%m-%d %H:%M",datetime)) c ON f.datetime = c.mindate or f.datetime = c.maxdate'.format(c = currency)

当我这样做时:

    SQLQuerySpecial("EUR", "2002-01-02 01:27:00", "2002-01-02 01:34:00")

我得到了结果:

('2002-01-02 01:26:33', 0.8913, 0.8913, 0.8913, 0.8913)

('2002-01-02 01:27:12', 0.8946, 0.8946, 0.8947, 0.89462)

('2002-01-02 01:27:49', 0.8946, 0.8946, 0.8947, 0.89462)

('2002-01-02 01:28:00', 0.8947, 0.8946, 0.8947, 0.8946454545454546)

('2002-01-02 01:28:00', 0.8946, 0.8946, 0.8947, 0.8946454545454546)

('2002-01-02 01:28:43', 0.8946, 0.8946, 0.8947, 0.8946454545454546)

('2002-01-02 01:28:43', 0.8946, 0.8946, 0.8947, 0.8946454545454546)

('2002-01-02 01:29:49', 0.8946, 0.8946, 0.8947, 0.89465)

('2002-01-02 01:29:49', 0.8947, 0.8946, 0.8947, 0.89465)

('2002-01-02 01:29:52', 0.8946, 0.8946, 0.8947, 0.89465)

('2002-01-02 01:29:52', 0.8947, 0.8946, 0.8947, 0.89465)

('2002-01-02 01:30:41', 0.8945, 0.8945, 0.8946, 0.8945299999999999)

...等 21 行结果。

我想要在 01:27 和 01:34 参数之间的函数只获得 8 行:

2002-01-02 01:27:xx ,买入价 @ 01:27 ,最高买入价在 01:27 到 01:28 之间,最低买入价在 01:27 到 01:28 之间,买入价@1: 28

2002-01-02 01:28:xx ,买入价 @ 01:28 ,最高买入价在 01:28 到 01:29 之间,最低买入价在 01:28 到 01:29 之间,买入价@1: 29

2002-01-02 01:29:xx ...

...

到 2002-01-02 01:34:xx ...

老实说,我试图找到正确的方法来做这件事,但这对我来说很棘手,我不太擅长 SQL。感谢阅读和帮助。

特别感谢 unutbu

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    试试这个:

    sql = '''
        SELECT DISTINCT
            f.dm,
            f1.price AS first,
            f.maxp AS max,
            f.minp AS min, 
            f2.price AS last
        FROM (
            SELECT datetime, strftime("%Y-%m-%d %H:%M",datetime) dm,
                   MIN(datetime) mindate, MAX(datetime) maxdate,
                   MIN(price) minp, MAX(price) maxp
            FROM {c} 
            WHERE datetime >= ? AND datetime < ?
            GROUP BY dm
            ) f
        INNER JOIN {c} f1
        ON f1.datetime = f.mindate
        INNER JOIN {c} f2
        ON f2.datetime = f.maxdate
        '''.format(c = currency)
    
    • dm 代表“日期-分钟”。我们按日期-分钟分组。
    • 有些行具有相同的datetime。 SELECT DISTINCT 消除重复行。
    • 每组的第一个和最后一个价格出现在不同的行上。到 将它们加入同一行需要 JOIN。这是本次会议的目的 上面有两个 INNER JOINS。

    【讨论】:

    • 这行得通,我用运算符 BETWEEN 作为日期,谢谢
    【解决方案2】:

    我推荐你使用 MySQLdb 然后使用fetchmany(8)获取前8列

    这里是 MySQLdb 的用户指南:http://mysql-python.sourceforge.net/MySQLdb.html

    这里是下载链接:http://sourceforge.net/projects/mysql-python

    这是我从你那里了解到的

    谢谢你..

    【讨论】:

      【解决方案3】:

      如果您希望 SQL 为您执行此操作,您需要执行 GROUP BY 分钟;那么您可以使用 MIN(minp) 和 MAX(minp) 来获取每分钟最低价格的范围。但是,看起来整个日期都是一个 SQL 列,所以并不那么容易。

      SELECT datetime_without_seconds, MIN(minp), MAX(minp) FROM ... 
          GROUP BY datetime_without_seconds
      

      如果您无法修改您的 SQL 表架构(或不想修改),那么编写一个处理从当前查询中获得的信息的 python 循环可能是最简单的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 1970-01-01
        • 2019-04-03
        • 2013-08-18
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 2013-03-16
        相关资源
        最近更新 更多