最大月度值,同时保留发生该值的数据

时间:2019-01-31 04:08:54

标签: python pandas time max

我的每日降雨数据如下:

   Date           Rainfall (mm) 
1922-01-01        0.0 
1922-01-02        0.0 
1922-01-03        0.0
1922-01-04        0.0
1922-01-05        31.5
1922-01-06        0.0
1922-01-07        0.0
1922-01-08        0.0
1922-01-09        0.0
1922-01-10        0.0
1922-01-11        0.0
1922-01-12        9.1
1922-01-13        6.4 

我正在尝试计算每年每个月的最大值,以及最大值出现的日期。我一直在使用代码:

rain_data.groupby(pd.Grouper(freq = 'M'))['Rainfall (mm)'].max()

这将返回正确的最大值,但返回每个月的结束日期,而不是发生最大事件的日期。

1974-11-30 0.0



我也尝试过使用.idxmax(),但这也只会返回每个月的最终值。

关于如何获得正确日期的任何建议?

1 个答案:

答案 0 :(得分:1)

pd.Grouper似乎改变了Datetime在组中的顺序,这打破了.sort_values + .tail的惯用技巧。而是按年和月分组:

df.sort_values('Rainfall (mm)').groupby([df.Date.dt.year, df.Date.dt.month]).tail(1)

样本数据+输出

import pandas as pd
import numpy as np

np.random.seed(123)
df = pd.DataFrame({'Date': pd.date_range('1922-01-01', freq='D', periods=100),
                   'Rainfall (mm)': np.random.randint(1,100,100)})

df.sort_values('Rainfall (mm)').groupby([df.Date.dt.month, df.Date.dt.year]).tail(1)

#         Date  Rainfall (mm)
#82 1922-03-24             92
#35 1922-02-05             98
#2  1922-01-03             99
#90 1922-04-01             99

pd.Grouper的问题在于它会以月末频率创建一个DatetimeIndex,这并不是我们真正需要的,而我们正在使用.apply。这为您提供了新的索引,并且可以按日期很好地排序!

(df.groupby(pd.Grouper(key='Date', freq='1M'))
     .apply(lambda x: x.loc[x['Rainfall (mm)'].idxmax()])
     .reset_index(drop=True))

#        Date  Rainfall (mm)
#0 1922-01-03             99
#1 1922-02-05             98
#2 1922-03-24             92
#3 1922-04-01             99

还可以与.drop_duplicates使用日期的前7个字符来获取“年月”。

(df.assign(ym = df.Date.astype(str).str[0:7])
   .sort_values('Rainfall (mm)')
   .drop_duplicates('ym', keep='last')
   .drop(columns='ym'))