我的数据框为(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循环?我认为这将需要几个小时才能完成。
我希望已经清楚地描述了这个问题,请原谅我是否有语法错误,这不是我的母语...
谢谢!
答案 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()
的计算正确,以防万一日期时间顺序未正确排序。