用Pandas GroupBy和重新取样保留最大时间

问题描述 投票:1回答:1

我有一个Pandas DataFrame,其中有多个站点和每个站点的每小时阵风("gust_speed")预测。我需要找到每个站点每天的最大阵风,以及阵风发生的时间。

pd_df
Out[24]: 
                    station  gust_speed
valid_dt                               
2020-05-21 15:00:00     AMO           6
2020-05-21 16:00:00     AMO           8
2020-05-21 17:00:00     AMO          11
2020-05-21 18:00:00     AMO          17
2020-05-21 19:00:00     AMO          19
2020-05-21 20:00:00     AMO          20
2020-05-21 21:00:00     AMO          21
2020-05-21 22:00:00     AMO          22
2020-05-21 23:00:00     AMO          24
2020-05-22 00:00:00     AMO          22
2020-05-22 01:00:00     AMO          18
2020-05-22 02:00:00     AMO          13
2020-05-22 03:00:00     AMO           8
2020-05-22 04:00:00     AMO           5
2020-05-22 05:00:00     AMO           2
2020-05-22 06:00:00     AMO           1
2020-05-22 07:00:00     AMO           2
2020-05-22 08:00:00     AMO           2
2020-05-22 09:00:00     AMO           3
2020-05-22 10:00:00     AMO           2
2020-05-22 11:00:00     AMO           3
2020-05-22 12:00:00     AMO           4
2020-05-22 13:00:00     AMO           3
2020-05-22 14:00:00     AMO           2
2020-05-22 15:00:00     AMO           7
2020-05-22 16:00:00     AMO           7
2020-05-22 17:00:00     AMO          10
2020-05-22 18:00:00     AMO          13
2020-05-22 19:00:00     AMO          19
2020-05-22 20:00:00     AMO          21
                    ...         ...
2020-05-23 19:00:00     YSA          21
2020-05-23 20:00:00     YSA          22
2020-05-23 21:00:00     YSA          22
2020-05-23 22:00:00     YSA          23
2020-05-23 23:00:00     YSA          22
2020-05-24 00:00:00     YSA          20
2020-05-24 01:00:00     YSA          17
2020-05-24 02:00:00     YSA          14
2020-05-24 03:00:00     YSA           4
2020-05-24 04:00:00     YSA           0
2020-05-24 05:00:00     YSA           1
2020-05-24 06:00:00     YSA           1
2020-05-24 07:00:00     YSA           3
2020-05-24 08:00:00     YSA           3
2020-05-24 09:00:00     YSA           4
2020-05-24 10:00:00     YSA           5
2020-05-24 11:00:00     YSA           0
2020-05-24 12:00:00     YSA           7
2020-05-24 13:00:00     YSA           3
2020-05-24 14:00:00     YSA           5
2020-05-24 15:00:00     YSA           8
2020-05-24 16:00:00     YSA          11
2020-05-24 17:00:00     YSA          14
2020-05-24 18:00:00     YSA          13
2020-05-24 19:00:00     YSA          19
2020-05-24 20:00:00     YSA          20
2020-05-24 21:00:00     YSA          21
2020-05-24 22:00:00     YSA          23
2020-05-24 23:00:00     YSA          22
2020-05-25 00:00:00     YSA          19

[15826 rows x 2 columns]

使用 GroupBy,我按站点对数据进行分组,然后重新取样以获得每日最大阵风。

daily_max=pd_df.groupby(['station']).resample('D').max()

daily_max
Out[28]: 
                   station  gust_speed
station valid_dt                      
AMO     2020-05-21     AMO          24
        2020-05-22     AMO          24
        2020-05-23     AMO          23
        2020-05-24     AMO          24
        2020-05-25     AMO          22
ANE     2020-05-21     ANE          55
        2020-05-22     ANE          21
        2020-05-23     ANE          20
        2020-05-24     ANE          23
        2020-05-25     ANE          20
ARH     2020-05-21     ARH          20
        2020-05-22     ARH          21
        2020-05-23     ARH          19
        2020-05-24     ARH          21
        2020-05-25     ARH          21
AVO     2020-05-21     AVO          26
        2020-05-22     AVO          29
        2020-05-23     AVO          28
        2020-05-24     AVO          27
        2020-05-25     AVO          24
AVY     2020-05-21     AVY          21
        2020-05-22     AVY          21
        2020-05-23     AVY          20
        2020-05-24     AVY          22
        2020-05-25     AVY          21
BAJC1   2020-05-21   BAJC1          24
        2020-05-22   BAJC1          22
        2020-05-23   BAJC1          22
        2020-05-24   BAJC1          25
        2020-05-25   BAJC1          22
                   ...         ...

我还需要最大风速发生的时间。用idxmax()代替max()使用同样的代码,会重现这个错误。

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

所以我试着用Grouper,但不知道如何先按站点进行分组。

daily_max=pd_df.groupby(pd.Grouper(freq='D')).gust_speed.idxmax()

daily_max
Out[35]: 
valid_dt
2020-05-21   2020-05-21 22:00:00
2020-05-22   2020-05-22 23:00:00
2020-05-23   2020-05-23 08:00:00
2020-05-24   2020-05-24 05:00:00
2020-05-25   2020-05-25 00:00:00
Freq: D, Name: gust_speed, dtype: datetime64[ns]

当然,这将返回每天所有站点中最大风速的时间,这并没有帮助。

所需的结果是显示日期 和时间 的最大速度、站点和最大速度的值。所以唯一缺少的是每个站的日最大速度发生的时间。

先谢谢你

pandas pandas-groupby
1个回答
1
投票

你可以添加 stationgroupby,所以可能使用 GroupBy.aggmaxidxmax:

df = pd_df.groupby(['station', pd.Grouper(freq='D')]).gust_speed.agg(['max','idxmax'])
print (df)
                    max              idxmax
station valid_dt                           
AMO     2020-05-21   24 2020-05-21 23:00:00
        2020-05-22   22 2020-05-22 00:00:00
YSA     2020-05-23   23 2020-05-23 22:00:00
        2020-05-24   23 2020-05-24 22:00:00
        2020-05-25   19 2020-05-25 00:00:00

0
投票

处理流程:.

  1. 添加日期栏
  2. 通过将它们按日期和站点进行分组,找到最大值,从而创建一个 DF
  3. 将原来的DF和创建的DF结合起来。
df['valid_date'] = pd.to_datetime(df['date'].dt.date)
df2 = df.groupby(['valid_date','station'])['gust_speed'].max().reset_index()
df2['valid_date'] = pd.to_datetime(df2['valid_date'])
pd.merge(df2, df, on=['valid_date','station','gust_speed'], how='left')

df
    valid_date  station     gust_speed  date
0   2020-05-21  AMO     29  2020-05-21 00:00:00
1   2020-05-21  AMO     29  2020-05-21 10:00:00
2   2020-05-21  ANE     29  2020-05-21 14:00:00
3   2020-05-21  ARH     29  2020-05-21 12:00:00
4   2020-05-21  ARH     29  2020-05-21 14:00:00
...     ...     ...     ...     ...
82  2020-05-26  ANE     24  2020-05-26 00:00:00
83  2020-05-26  ARH     26  2020-05-26 00:00:00
84  2020-05-26  AVO     29  2020-05-26 00:00:00
85  2020-05-26  AVY     26  2020-05-26 00:00:00
86  2020-05-26  BAJC1   27  2020-05-26 00:00:00
© www.soinside.com 2019 - 2024. All rights reserved.