Перегруппировать список времени в Python из запроса SQL - PullRequest
1 голос
/ 24 февраля 2012

Я хочу разделить список дат по часам и выполнять операции, как в среднем.Я написал программу на Python, которая вызывает базу данных sqlite3, запрос возвращает список:

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 ]

1 голос
/ 24 февраля 2012

itertools.groupby используйте параметр ключа . Это не даст желаемого результата, если итерируемые (в данном случае результаты) не отсортированы .Сортировка должна быть сделана в запросе вашей базы данных.Если вы действительно получаете строки (не метки времени), это будет что-то вроде:

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)
1 голос
/ 24 февраля 2012

Этот запрос может быть выполнен в 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)
1 голос
/ 24 февраля 2012

itertools.groupby поддерживает функцию клавиши и выглядит так, как вы хотите.Адекватная функция могла бы уменьшить временные метки до часов, начиная с эпохи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...