Есть ли способ получить среднее значение за день из моего набора данных в Python? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть набор данных с датой, временем и температурой, которые я получаю, используя запрос к моей базе данных. Я не знаю, как получить среднее значение за каждый день. Я хочу создать список со значениями x для температуры и другим массивом с датой, связанной с этим значением, чтобы я мог построить график 2 на графике.

Вот небольшой пример того, как может выглядеть мой набор данных, когда он возвращается из запроса:

[(21, datetime.datetime(2019, 4, 29, 9, 57, 53)), 
(22, datetime.datetime(2019, 4, 29, 9, 56, 52)), 
(26, datetime.datetime(2019, 4, 29, 9, 55, 49)), 
(22, datetime.datetime(2019, 4, 30, 9, 54, 49)), 
(20, datetime.datetime(2019, 4, 30, 9, 53, 49)), 
(19, datetime.datetime(2019, 5, 1, 9, 52, 48)), 
(18, datetime.datetime(2019, 5, 1, 9, 51, 47)), 
(21, datetime.datetime(2019, 5, 1, 9, 50, 46))]

Я бы хотел получить 2 списка, которые выглядят так:

values = [23, 21, 19.3]
labels = ["2019-4-29", "2019-4-30", "2019-5-1"]

Я не уверен, как обрабатывать свои данные, поэтому я получаю что-то вроде этого, и я даже не уверен в правильных терминах для поиска способа сделать это.

Ответы [ 3 ]

1 голос

Есть два подхода:

  1. Использование pandas

Попробуйте сгенерировать TimeSeries

series = pd.DataFrame.from_values(data, columns=['Value', 'Date'], index=['Date'])
result = series.resample("D").mean()

выход:

                Value
Date                 
2019-04-29  23.000000
2019-04-30  21.000000
2019-05-01  19.333333
  1. Нет pandas разрешено

Используйте обычные dict:

from collections import defaultdict

grouper = defaultdict(list)
for value, date in data.items():
    grouper[date].append(value)

values = [sum(day) / len(day) for day in grouper.values()]
labels = list(grouper.keys())

Результат будет таким же, как в примере.

1 голос
/ 02 мая 2019

Если вы используете pandas, что вам следует сделать, вы можете сделать следующее:

import pandas as pd

df = pd.DataFrame([
    (21, datetime.datetime(2019, 4, 29, 9, 57, 53)), 
    (22, datetime.datetime(2019, 4, 29, 9, 56, 52)), 
    (26, datetime.datetime(2019, 4, 29, 9, 55, 49)), 
    (22, datetime.datetime(2019, 4, 30, 9, 54, 49)), 
    (20, datetime.datetime(2019, 4, 30, 9, 53, 49)), 
    (19, datetime.datetime(2019, 5, 1, 9, 52, 48)), 
    (18, datetime.datetime(2019, 5, 1, 9, 51, 47)), 
    (21, datetime.datetime(2019, 5, 1, 9, 50, 46)),
], columns=['value', 'date']).set_index('date')

# resample groups your values by 'd' which stands for "day" and aggregate them by average
df_day = df.resample('d').mean()

Вот ссылка на pandas документацию: http://pandas.pydata.org/pandas-docs/stable/

1 голос
/ 02 мая 2019

Попробуйте pandas (d ваш список):

import pandas as pd

pd.DataFrame(d, columns=['Value', 'Date'])
df.groupby(df['Date'].map(datetime.datetime.date)).mean()

выход:

                Value
Date                 
2019-04-29  23.000000
2019-04-30  21.000000
2019-05-01  19.333333
...