Преобразование многолетних временных рядов в усредненные временные ряды за один год, используя pandas - PullRequest
1 голос
/ 09 апреля 2020

У меня есть фрейм данных (df) со столбцами с именами дата, год, месяц, день, час и энергия. Это многолетний временной ряд, который я хочу преобразовать в усредненный временной ряд за один год (8760 баллов, т.е. 365 * 24 балла), где столбец Energy_Mean представляет собой усредненное значение.

df is

date           Year  Month  Day  Hour       Energy
1/1/1999 0:00  1999   Jan    1     1        45.0     
1/1/1999 1:00  1999   Jan    1     2        73.5     
1/1/1999 2:00  1999   Jan    1     3        82.4     
1/1/1999 3:00  1999   Jan    1     4        90.0     
1/1/1999 4:00  1999   Jan    1     5        72.2
.
.
.
12/31/1999 23:00  1999 Dec  12    24       77.0
.
.
.
12/31/2019 23:00  2019 Dec  12    24       84.3

Задача - преобразовать ее в усредненную форму, как показано ниже:

Month  Day  Hour      Energy_Mean
Jan    1     1        22.45     
Jan    1     2        73.5     
Jan    1     3        57.4     
Jan    1     4        88.0     
Jan    1     5        33.2
.
.
.
Dec    31    24       77.0

Попытка выяснить, является ли pivot_table или groupby - лучший метод из pandas, используемый для преобразования временных рядов во фрейм данных 8760 отсчетов. Кроме того, я хочу, чтобы вывод сортировался по месяцам, а НЕ по алфавиту. Как январь, февраль, март, апрель НЕ апрель, август ..

Мой код:

p50_8760 = df.groupby(['Month', 'Day', 'Hour'])['Energy'].mean()
df_p50_8760 = p50_8760.to_frame()

В выходном файле отсутствуют имена столбцов или количество точек данных 8760 точек данных .

1 Ответ

0 голосов
/ 09 апреля 2020

Согласно ответу в этом вопросе SO Pandas: разница между группами и сводными таблицами сводная таблица и groupby могут быть одинаково хорошо подходящими, поскольку они отличаются только формой результата. Так что выберите тот, с которым вам будет легче работать.

Для моего примера я буду использовать сводную таблицу.

Чтобы отсортировать по индексу месяцев, а не по алфавиту по имени, я добавлю дополнительный столбец 'Month_ind'. Конечно, вы могли бы составить карту вручную. Поскольку у нас уже есть столбец даты и времени, я решил позволить Pandas сделать этот шаг.

Числовой столбец 'Month_ind' может затем использоваться для сортировки в конце:

df = pd.read_csv('data/multi_year_ts.csv')

df['date'] = pd.to_datetime(df['date']) # convert column to datetime

df['Month_ind'] = df['date'].map(lambda e: e.month)

pivot = pd.pivot_table(df, index=['Month_ind', 'Day', 'Hour'], columns=['Year'], values=['Energy'])

print(pivot.sort_values('Month_ind'))

Результат:

                   Energy                  
Year                 1999  2005  2007  2019
Month_ind Day Hour                         
1         1   1      45.0  60.4  55.2   NaN
              2      73.5   NaN   NaN   NaN
              3      82.4   NaN   NaN   NaN
              4      90.0   NaN   NaN   NaN
              5      72.2   NaN   NaN   NaN
12        12  24     77.0   NaN   NaN  84.3

Обратите внимание, что значения не верны (и в основном NaN), поскольку у меня был только очень маленький тестовый образец.

Чтобы получить среднее значение для определенного c часа на данную дату для всех лет, сначала транспонируйте сводную единицу:

print(pivot.T.mean())

Конечный результат:

Month_ind  Day  Hour
1          1    1       53.533333
                2       73.500000
                3       82.400000
                4       90.000000
                5       72.200000
12         12   24      80.650000
dtype: float64
...