从sql查询重新组合python中的时间列表

时间:2012-02-24 19:05:44

标签: python sql sqlite

我想在几个小时内拆分日期清单,并按平均值进行操作。 我编写了一个调用sqlite3数据库的python程序,查询返回一个列表:

def SQLQueryDaily(currency,start,end):
    #year = start[0,3]
    c.execute('SELECT buy, sell FROM '+currency+' WHERE (datetime > "'+start+'" AND datetime < "'+end+'")')
    for row in c:
        print (row)

并打印:

('2002-01-02 01:33:57',0.894)

('2002-01-02 01:33:58',0.895)

('2002-01-02 01:33:59',0.893)

等数千行...

我想要做的是将此列表重新组合成小时,并在返回的数字中取平均值(此处:0.894)

老实说,我试图找到一种方法来按小时或天重新组合结果,但我不知道是否有正确的方法来做,请帮助谢谢

3 个答案:

答案 0 :(得分:1)

itertools.groupby支持key function,看起来就像你想要的那样。一个适当的功能可能会将时间戳减少到自纪元以来的几小时。

答案 1 :(得分:1)

itertools.groupby使用key param除非对iterable(在这种情况下导致的结果)进行排序,否则不会产生预期的结果。排序应在数据库查询中完成。 如果你真的得到字符串(而不是时间戳),那就像是:

l = [('2002-01-02 01:33:57', 0.894),
     ('2002-01-02 01:33:58', 0.895),
     ('2002-01-02 01:34:59', 0.893)]

for k,ll in groupby(l,lambda t: t[0][:16]):
    print k,sum(v for t,v in ll)

答案 2 :(得分:1)

此查询可以在sqlite中执行。按小时分组:

def SQLQueryDaily(currency,start,end):
    sql = '''
        SELECT buy, AVG(sell)
        FROM {t}
        WHERE (datetime > ? AND datetime < ?)
        GROUP BY strftime('%Y-%m-%d %H',date)
        '''.format(t = currency)
    c.execute(sql, [start, end])
    for row in c:
        print (row)    

分组15分钟:

sql = '''
    SELECT buy, AVG(sell)
    FROM {t}
    WHERE (datetime > ? AND datetime < ?)
    GROUP BY strftime('%s', date)/(15*60)
    '''.format(t = currency)

获取每组的第一行和最后一行:

sql = '''
    SELECT f.date, f.sell, t.minp, t.maxp, t.avgp
    FROM {t} f
    INNER JOIN (
        SELECT MIN(date) mindate, MAX(date) maxdate,
               MIN(sell) minp, MAX(sell) maxp, AVG(sell) avgp
        FROM {t}
        GROUP BY strftime('%s', date)/(15*60)
        ) t
        ON f.date = t.mindate or f.date = t.maxdate
    '''.format(t = currency)