Pandas idxmax()无法在包含NaN的时间段分组Series上工作

4

我有一个包含多年日常标量数值的序列,对于某些年份没有数据。

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. 每年最大值所在的日期 对于那些没有数据的年份,应该返回nan。

要解决第一个问题,可以采用以下方法:

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

显然,报告的错误尚未修复,对于分类数据的建议解决方法似乎对于时间分组/重新采样数据无效。
有人能为这种情况提供合适的解决方法,或者可能是完全不同(且高效)的解决问题的方法吗?
提前致谢!
1个回答

8

问题在于您在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]

1
非常感谢! 这个完美地运作了! 我知道2015年的数据丢失,但它也适用于对重采样数据应用例如max()之类的方法。尽管如此,我仍认为这更像是一种解决方法,而直接在重新采样的数据上应用idxmax()应该可以得到与max()相同的输出。再次感谢! - Jan N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接