我想在几个小时内拆分日期清单,并按平均值进行操作。 我编写了一个调用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)
老实说,我试图找到一种方法来按小时或天重新组合结果,但我不知道是否有正确的方法来做,请帮助谢谢
答案 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)