如何取每k个元素(小时)的列平均值?

时间:2019-05-02 02:22:33

标签: python pandas dataframe

我的数据框为(286101,4),它是一个城市污染物的数据集,请注意有几个站点:

       date     hour   station   CO   
0     1/1/13     1        CA      1    
1     1/1/13     2        CA      5    
2     1/1/13     3        CA      4    
3     1/1/13     1        NY      3    
4     1/1/13     2        NY      6    
5     1/1/13     3        NY      2   

我想获取每个站点每24小时的CO平均值,并保持小时数的测量方式,我尝试了一个简单的groupby,但我正在获取当天的平均值(应该是这样)

为示例起见,假设我每2小时取一次平均值,则预期输出为:

       date     hour   station   CO   CO_mean
0     1/1/13     1        CA      1     na
1     1/1/13     2        CA      5    3.0
2     1/1/13     3        CA      4    4.5
3     1/1/13     1        NY      3     na
4     1/1/13     2        NY      6    4.5
5     1/1/13     3        NY      2    4.0

在每个站点的第一个日期,我希望得到一个nan,因为没有先前的元素。对于每24小时的平均值,前24小时为nans。

有没有一种方法可以不使用for-if循环?我认为这将需要几个小时才能完成。

我希望已经清楚地描述了这个问题,请原谅我是否有语法错误,这不是我的母语...

谢谢!

1 个答案:

答案 0 :(得分:2)

对于时间序列数据,我认为对日期/日期时间对象而不是它们的标量值进行处理是一种好习惯。这就是我要做的(根据您2小时的滚动平均值示例)

import pandas as pd

>>>df
       date     hour   station   CO   
0     1/1/13     1        CA      1    
1     1/1/13     2        CA      5    
2     1/1/13     3        CA      4    
3     1/1/13     1        NY      3    
4     1/1/13     2        NY      6    
5     1/1/13     3        NY      2  

# Create a datetime column
df['datetime'] = pd.to_datetime([''.join([' '.join([df.loc[i, 'date'], str(df.loc[i, 'hour'])]),':00']) for i in df.index])
# We can now drop the scalar date and hour columns
df.drop(['date', 'hour'], axis=1, inplace=True)
# Sort into proper order so that rolling() is computed correctly
df.sort_values(['station','datetime'], inplace=True)
# Set the datetime column as the dataframe index
df.set_index('datetime', inplace=True)

>>>df.groupby('station').rolling(2).mean()
                              CO
station datetime
CA      2013-01-01 01:00:00  NaN
        2013-01-01 02:00:00  3.0
        2013-01-01 03:00:00  4.5
NY      2013-01-01 01:00:00  NaN
        2013-01-01 02:00:00  4.5
        2013-01-01 03:00:00  4.0

编辑包括一个排序步骤,以确保rolling()的计算正确,以防万一日期时间顺序未正确排序。