У меня есть набор данных с датой и временем, который я получаю, используя запрос к моей базе данных. Я не знаю, как получить среднее значение за каждый день. Я хочу создать список со значениями 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"]

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

-1
Luke Bray 2 Май 2019 в 12:17

3 ответа

Лучший ответ

Если вы используете 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/ панды - документы / стабильный /

1
Adrien El Zein 2 Май 2019 в 09:39

Попробуйте 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
1
Yevhen Kuzmovych 2 Май 2019 в 09:24

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

  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
Александр Свито 2 Май 2019 в 09:29