Как я могу разделить единые значения фрейма данных по среднемесячным значениям?

У меня есть следующие 15-минутные данные как dataframe в течение 3 лет. Первые два столбца являются индексом.

2014-01-01 00:15:00  1269.6      
2014-01-01 00:30:00  1161.6      
2014-01-01 00:45:00  1466.4      
2014-01-01 01:00:00  1365.6      
2014-01-01 01:15:00  1362.6      
2014-01-01 01:30:00  1064.0      
2014-01-01 01:45:00  1171.2      
2014-01-01 02:00:00  1171.0      
2014-01-01 02:15:00  1330.4      
2014-01-01 02:30:00  1309.6      
2014-01-01 02:45:00  1308.4      
2014-01-01 03:00:00  1494.0    

Я использовал resample для получения второй серии с ежемесячными средними значениями.

data_Monthly = data.resample('1M', how='mean')

Как я могу разделить значения в последнем столбце на их среднемесячное значение, в результате чего все еще будет временной ряд с 15-минутной детализацией?

Ответы

Ответ 1

Сначала сделайте группу:

import pandas as pd

In [1]: grouper = pd.TimeGrouper("1M")

Затем создайте новый столбец:

In [2]: df['normed'] = df.groupby(grouper).transform(lambda x: x/x.mean())

Проводя групповой метод groupby, вы группируете свои данные в один месяц. Внутри каждого фрагмента вы делите 15-минутный интервал времени по среднему значению за этот месяц.

Ответ 2

Я думаю, что обычно рекомендуется использовать Grouper вместо TimeGrouper. Посмотрите . Например, если ваш столбец называется Date, используйте

grouper = pd.Grouper(key='Date', freq='M')

вместо использования TimeGrouper, а затем продолжить, как предложил @Zelazny7. Если ваш столбец не является индексом datetime, используйте

df['Date'] = pd.to_datetime(df['Date'])

Ответ 3

Это можно сделать в одной строке:

df.groupby([df.index.year, df.index.month]).transform(lambda x: x/x.mean())