Усреднение по конкретным месяцам в пандах - PullRequest
0 голосов
/ 24 января 2019

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

nd_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([11,12])]
jfm_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([1,2,3])]

.. однако у меня возникают проблемы с манипулированием датами (годами), чтобы получить простое среднее значение. Я неопытен с пандами и думаю, есть ли более элегантный способ, чем экспорт, чтобы преуспеть и изменить год! Данные в форме ..

Date    
1899-01-01 00:00:00 100994.0
1899-02-01 00:00:00 100932.0
1899-03-01 00:00:00 100978.0
1899-11-01 00:00:00 100274.0
1899-12-01 00:00:00 100737.0
1900-01-01  100655.0
1900-02-01  100633.0 
1900-03-01  100512.0
1900-11-01  101212.0
1900-12-01  100430.0

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Группировка данных по месяцам с использованием pd.Grouper

g = df.groupby(pd.Grouper(freq="M"))  # DataFrameGroupBy (grouped by Month)

Для каждой группы рассчитайте среднее значение только для столбца 'A'

monthly_averages = g.aggregate({"A":np.mean})
0 голосов
/ 24 января 2019

Интересная проблема. Так как вы усредняете за пять месяцев, это делает повторную выборку более сложной. Вы должны быть в состоянии преодолеть это путем логической индексации и создания нового фрейма данных. Я предполагаю, что ваш индекс является значением даты и времени.

index = pd.date_range('1899 9 1', '1902, 3, 1', freq='1M')
data = np.random.randint(0, 100, (index.size, 5))
df = pd.DataFrame(index=index, data=data, columns=list('ABCDE'))

# find rows that meet your criteria and average
idx1 = (df.index.year==1899) & (df.index.month >10)
idx2 = (df.index.year==1900) & (df.index.month < 4)

winterAve = df.loc[idx1 | idx2, :].mean(axis=0)

Просто чтобы визуально убедиться, что индексация / нарезка делает то, что нам нужно ...

>>>df.loc[idx1 | idx2, :]
Out[200]: 
             A   B   C   D   E
1899-11-30  48  91  87  29  47
1899-12-31  63   5   0  35  22
1900-01-31  37   8  89  86  38
1900-02-28   7  35  56  63  46
1900-03-31  72  34  96  94  35

Вы должны иметь возможность поместить это в цикл for для повторения в течение нескольких лет и т. Д.

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