【问题标题】:Regroup time list in python from sql query从sql查询重新组合python中的时间列表
【发布时间】:2012-02-24 19:05:43
【问题描述】:

我想以小时为单位拆分日期列表并进行平均操作。 我编写了一个调用 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)

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

【问题讨论】:

    标签: python sql sqlite


    【解决方案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)
    

    【讨论】:

    • 很好,谢谢,请问您如何在 15 分钟内重新组合?
    • 它工作正常,我检查了SQL Aggregate Functions 和 MAX(sell),MIN(sell) 工作正常,但似乎 FIRST(sell) LAST(sell) 不适用于 sqlite3,任何关于如何通过查询获取 Hour/15min 的第一个和最后一个值的想法? This other answer doesn't really help
    • FIRST 和 LAST 是指每组中具有最小和最大日期的行吗?
    • 是的,我需要有时间段开始的第一行,时间段结束的最后一行,时间段内的最大值和最小值,大约@987654323 @谢谢你的时间
    • 最后缺少 WHERE (datetime > ? AND datetime
    【解决方案2】:

    itertools.groupby 支持 key function 并且看起来像你想要的。一个适当的函数可能会将时间戳减少到自纪元以来的小时数。

    【讨论】:

      【解决方案3】:

      itertools.groupby 使用key param除非对可迭代对象(本例中的结果)进行排序,否则这不会给出所需的结果。排序应该在您的数据库查询中完成。 如果你真的得到字符串(不是时间戳),它会是这样的:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-22
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2020-06-05
        • 2011-05-04
        • 1970-01-01
        相关资源
        最近更新 更多