繁体   English   中英

Pandas dataframe 日期时间索引 groupby

[英]Pandas dataframe datetime index groupby

考虑到我有以下 tmax_period dataframe:

                     ID Element  Data_Value
Date                                       
2005-01-01  USW00014853    TMAX          56
2005-01-01  USC00200228    TMAX         150
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207308    TMAX         150
2005-01-01  USC00200230    TMAX         122
DatetimeIndex(['2005-01-01', '2005-01-02', '2005-01-03', '2005-01-04',
               '2005-01-05', '2005-01-06', '2005-01-07', '2005-01-08',
               '2005-01-09', '2005-01-10',
               ...
               '2014-12-22', '2014-12-23', '2014-12-24', '2014-12-25',
               '2014-12-26', '2014-12-27', '2014-12-28', '2014-12-29',
               '2014-12-30', '2014-12-31'],
              dtype='datetime64[ns]', name='Date', length=3650, freq=None)

如何按月和日对行进行分组,并将最大 function 应用于 Data_Value 列,以便稍后构建具有 365 个数据点的 plot? 我尝试执行以下操作:

tmax_period.groupby(by=[period.index.month, period.index.day])['Data_Value'].max()

但我得到一个“AssertionError:Grouper 和轴必须是相同的长度”错误。

编辑:按照评论中的要求添加tmax_period.head().to_dict()的结果:

{'Data_Value': {Timestamp('2005-01-01 00:00:00'): 122},
 'Element': {Timestamp('2005-01-01 00:00:00'): 'TMAX'},
 'ID': {Timestamp('2005-01-01 00:00:00'): 'USC00200230'}}

日期范围包括闰年,因此按月和日汇总显然会产生 366 个数据点。 这是一个例子:

s = pd.Series(data=1, 
              index=pd.date_range(start='2005-01-01', 
                                  end='2014-12-31', 
                                  freq='d'), 
              name='x')
s.groupby([s.index.month, s.index.day]).count(). # has 366 elements, inc Feb 29

groupby命令 366 个元素。

DatetimeIndex 是如何创建的?

我发现pd.Grouper在按索引级别分组或按日期时间频率分组(或在这种情况下,两者兼而有之)时最容易使用。

df.groupby([
    pd.Grouper(level=0, freq='MS'),
    pd.Grouper(level=0, freq='D')
])['Data_Value'].max()

这将创建两个Grouper对象,它们分别在第 0 个索引级别上按月(开始)和天聚合。

我不知道为什么我以前没有想过这个解决方案。 它可以找到一年中每一天的最大值,而不会像我想要的那样被跳跃弄乱:

tmax_period = period.groupby(lambda x: (x.month, x.day))['Data_Value'].max()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM