考虑到我有以下tmax_period数据帧:
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)
如何将行按月和日分组,并将max函数应用于Data_Value列,以便以后可以使用365个数据点构建图?我尝试执行以下操作:
tmax_period.groupby(by=[period.index.month, period.index.day])['Data_Value'].max()
但是出现了“ AssertionError:石斑鱼和轴的长度必须相同”错误。
编辑:按照评论中的要求添加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'}}
答案 0 :(得分:1)
我发现pd.Grouper
是在索引级别上进行分组或在日期时间频率上进行分组(或在两种情况下均为两者)时最容易使用的方法。
df.groupby([
pd.Grouper(level=0, freq='MS'),
pd.Grouper(level=0, freq='D')
])['Data_Value'].max()
这将创建两个Grouper
对象,它们分别在第0个索引级别按月(开始)和天进行聚合。
答案 1 :(得分:0)
日期范围包括leap年,因此按月和日进行汇总将显然产生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?
答案 2 :(得分:0)
我不知道为什么以前没有想到过这种解决方案。它可以找到一年中每一天的最大值,而不会像我想要的那样被飞跃所困扰:
tmax_period = period.groupby(lambda x: (x.month, x.day))['Data_Value'].max()