【问题标题】:Get monthly average in pandas获取熊猫的月平均值
【发布时间】:2021-04-04 20:47:42
【问题描述】:

我有以下时间序列:

        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')

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:

    我们可以将您的日期时间列转换为每月频率的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_index 和resample.mean。

    【讨论】:

    • 如果我错了请纠正我,但我认为 days_in_month 考虑了特定月份的所有自然天数,但我没有每天的数据
    • @M.E.道歉,误解了这个问题。请在此处查看编辑。
    【解决方案2】:

    您可以尝试这样的事情,甚至不需要更改索引:

    data_month = data.resample('M', on='Date').mean()

    请注意,重采样本身并不能解决问题。 .mean() 是必需的。

    更多关于documentation :)

    【讨论】:

    • 我试了一下,我得到:TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“Index”实例
    • 好的,那么请确保您的“日期”列是日期时间类型。类似data.Date = pd.to_datetime(data.Date)
    • @cs95 实际上我想除以每月的行数,而不是除以一个月的自然天数(以防在原始问题中不清楚)
    • 我选择了@cs95 答案,但这个答案实际上非常有效,我正在收藏它,因为我发现它非常有用
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2021-08-16
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2023-02-17
    相关资源
    最近更新 更多