在pandas中获取每月平均值

5

我有以下时间序列:

        Date        Value
0       2006-01-03  18
1       2006-01-04  12
2       2006-01-05  11
3       2006-01-06  10
4       2006-01-09  22
...     ...     ...
3510    2019-12-23  47
3511    2019-12-24  46
3512    2019-12-26  35
3513    2019-12-27  35
3514    2019-12-30  28

我想要计算每个月的平均值。因此,每个月的伪代码如下:

  1. 对于该月份中的每一天,将所有数值相加。
  2. 除以该月包含数据的天数。

期望的输出应该类似于:

        Date        Value
0       2006-01     17.45
1       2006-02     18.23
2       2006-04     16.79
3       2006-05     17.98
...     ...     ...
166     2019-11     37.89
167     2019-12     36.34

我尝试过这个,但没有成功:

data = data.set_index('Date')
data.resample('M')

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-435afe449f1f> in <module>
     47 data = pd.DataFrame(dataList, columns=('Date', 'Value'))
     48 data = data.set_index('Date')
---> 49 data.resample('M')
2个回答

12

我们可以将您的日期时间列转换为按月频率的PeriodIndex,然后使用GroupBy.mean进行平均值计算:

df.groupby(pd.PeriodIndex(df['Date'], freq="M"))['Value'].mean()
    
Date
2006-01    14.6
2019-12    38.2
Freq: M, Name: Value, dtype: float64

df.groupby(pd.PeriodIndex(df['Date'], freq="M"))['Value'].mean().reset_index()

      Date  Value
0  2006-01   14.6
1  2019-12   38.2

这种方法的一个注意点是,缺失的月份不会显示出来。如果这很重要,请以同样的方式使用 set_indexresample.mean


请纠正我,但我认为days_in_month考虑了特定月份中的所有自然日,但我没有每天的数据。 - M.E.
1
@M.E. 抱歉,误解了问题。请看这里的编辑。 - cs95

8
您可以尝试这样做,甚至不需要更改索引: data_month = data.resample('M', on='Date').mean() 请注意,仅使用resample不能达到效果,必须使用.mean()
更多信息请参见文档 :)

我尝试了一下,结果出现了 TypeError: 只有 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 才是有效的,但得到了 'Index' 的实例。 - M.E.
1
好的,请确保您的“Date”列是Datetime类型。可以使用以下代码实现:data.Date = pd.to_datetime(data.Date) - nunohpinheiro
@cs95 实际上我想按每个月的行数进行除法,而不是按自然日计算(如果在原问题中不清楚的话)。 - M.E.
1
我选择了@cs95的答案,但这个也非常有效,我会将其收藏起来,因为我发现它非常有用。 - M.E.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接