熊猫分组值并按日期范围获取平均值

时间:2019-01-30 16:27:54

标签: python pandas

我有一个这样的DataFrame

df = pd.DataFrame( data = numpy_data, columns=['value','date'])

    value   date
0   64.885  2018-01-11
1   74.839  2018-01-15
2   41.481  2018-01-17
3   22.027  2018-01-17
4   53.747  2018-01-18
...  ...        ...
514 61.017  2018-12-22
515 68.376  2018-12-21
516 79.079  2018-12-26
517 73.975  2018-12-26
518 76.923  2018-12-26

519 rows × 2 columns

我想绘制valuedate,而我正在使用它

df.plot( x='date',y='value')

我明白了

enter image description here

这里的要点是,此图有很多波动,我想对此加以缓解,我的想法是按日期间隔对值进行分组,并获得平均值,例如10天,即7月1日至7月10日之间的平均值,以及在7月5日创建点

很长的路要走,获取日期范围,用开始和结束日期分隔N个范围,使用日期过滤数据以计算平均值,然后放入其他DataFrame中。

  

有没有一种简短的方法?

PD:忽略峰

2 个答案:

答案 0 :(得分:1)

例如,您可以做的一件事是使用DataFrame.rollingmean来获取数据帧的滚动平均值:

df = df.set_index(df.date).drop('date', axis=1)
df.rolling(3).mean().plot()

对于您拥有的示例数据框,直接绘制数据框将导致:

enter image description here

采用滚动平均值,您将:

enter image description here

我在这里选择了window中的3,但是他的选择取决于您希望它有多平滑

答案 1 :(得分:0)

基于yatu答案

他的答案的问题是,滚动函数将值视为索引,而不是日期,通过一些转换,滚动可以将时间戳记用作使用时间作为窗口[pandas.rolling]

df = pd.DataFrame( data = numpy_data, columns=['value','date'])

df['date'] = df.apply(lambda row: pd.Timestamp(row.date), axis=1 )
df = df.set_index(df.date).drop('date', axis=1)
df.sort_index(inplace=True)

df.rolling('10d').mean().plot( ylim=(30,100) , figsize=(16,5),grid='true')
最终结果

Final result