Pandas idxmax () не работает с сериями, сгруппированными по периодам времени, которые содержат nan

У меня есть серия, которая содержит индексы скалярных значений по дням за несколько лет. За несколько лет нет данных.

2014-10-07    5036.883410
2013-10-11    5007.515654
2013-10-27    5020.184053
2014-09-12    5082.379630
2014-10-14    5032.669801
2014-10-30    5033.276159
2016-10-03    5046.921912
2016-10-19    5141.861889
2017-10-06    5266.138810

От этого я хочу получить 1. максимум за каждый год 2. день максимума за каждый год Для тех лет, где нет данных, должна быть нан.

Для решения 1. следующие работы:

import pandas as pd
import numpy as np

data= pd.Series( index=pd.DatetimeIndex(['2014-10-07', '2013-10-11', '2013-10-27', '2014-09-12', '2014-10-14', '2014-10-30', '2016-10-03', '2016-10-19', '2017-10-06'], dtype='datetime64[ns]', name='time', freq=None), data=np.array([5036.88341035, 5007.51565355, 5020.18405295, 5082.37963023, 5032.66980146, 5033.27615931, 5046.92191246, 5141.86188915, 5266.1388102 ]))

# get maximum of each year  
data.resample('A').max()

Однако я пробовал разные варианты, чтобы получить индекс даты с максимумом, но все они потерпели неудачу:

data.resample('A').idxmax()

Это вызывает следующую ошибку атрибута:

AttributeError: 'DatetimeIndexResampler' object has no attribute 'idxmax'

Затем я попробовал следующее:

data.groupby(pd.TimeGrouper('A')).idxmax()

но это дало ValueError без спецификации. Затем я нашел обходной путь это:

data.groupby(pd.TimeGrouper('A')).agg( lambda x : x.idxmax() )

но я не носил и для временно сгруппированных данных:

ValueError: attempt to get argmax of an empty sequence

По-видимому, сообщенный ошибка еще не исправлен, и предлагаемый обходной путь для категориальных данных, похоже, не работает для временно сгруппированных / повторно дискретизированных данных.

Может ли кто-нибудь предоставить подходящий обходной путь для этого случая или, может быть, совершенно другой (и эффективный) подход к решению вышеуказанной проблемы?

Заранее спасибо!

4
0
1 609
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что у вас нет записей за 2015 год, но создается временной период для 2015 года, поскольку он находится в пределах ваших лет. Вам нужно вручную обработать этот кейс:

data.resample('A').agg(
    lambda x : np.nan if x.count() == 0 else x.idxmax()
)

Выход:

time
2013-12-31   2013-10-27
2014-12-31   2014-09-12
2015-12-31          NaT
2016-12-31   2016-10-19
2017-12-31   2017-10-06
Freq: A-DEC, dtype: datetime64[ns]

Большое спасибо! Это прекрасно работает! Мне были известны недостающие данные за 2015 год, но они также работали для подачи заявки, например. max () для данных с передискретизацией. Несмотря на это, я бы рассмотрел это скорее как обходной путь, и применение idxmax () непосредственно к передискретизированным данным должно дать тот же результат, что и для max (). Спасибо еще раз!

Jan N 31.10.2018 14:44

Другие вопросы по теме