pandas 重新采样以获得具有时间序列数据的月平均值

Posted

技术标签:

【中文标题】pandas 重新采样以获得具有时间序列数据的月平均值【英文标题】:pandas resample to get monthly average with time series data 【发布时间】:2019-09-17 08:00:38 【问题描述】:

我正在使用来自 tableau (https://community.tableau.com/thread/194200) 的时间序列数据集,其中包含每日家具销售额,我想重新采样以获得平均每月销售额。

我尝试在 Pandas 中使用 resample 来获得月平均值:

There are four days in January selling furniture, 
and there is no sales in the rest of Jan.

Order Date   Sales
...
2014/1/6     2573.82
2014/1/7     76.728
2014/1/16    127.104
2014/1/20    38.6
...

y_furniture = furniture['Sales'].resample('MS').mean()

我希望结果是每月的实际平均销售额。

也就是说,所有的日销售额加起来除以 31 天,即 90.85,但代码将总和除以 4,约为 704。这并不能正确反映实际的月销售额。

有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

您可以使用数据透视表获取每月的平均销售额: 试试:

df['Order_date']=pd.to_datetime(df['Order_date'])
df['Month']=df['Order_date'].dt.month
df_pivot=df.pivot_table(columns='Month',aggfunc='mean')

【讨论】:

【参考方案2】:

我不确定您的预期答案是 90.85 还是 704。所以我是 为两者提供解决方案,根据您的要求选择它。

l1 = ['Order Date',
      'Sales',
      ]
l2 = [['2014/1/6',2573.82],
        ['2014/1/7',76.728],
        ['2014/1/16',127.104],
        ['2014/1/20',38.6],
        ['2014/2/20',38.6],
     ]
df = pd.DataFrame(l2, columns=l1)

df['Order Date'] = pd.to_datetime(df['Order Date'])  #make sure Order Date is of Date type



x = df.groupby(df['Order Date'].dt.month).mean()  #or .agg('mean')
#### Output  ####
Order Date         
1           704.063
2            38.600



def doCalculation(df):
    groupSum = df['Sales'].sum()
    return (groupSum / df['Order Date'].dt.daysinmonth)

y = df.groupby(df['Order Date'].dt.month).apply(doCalculation).groupby(['Order Date']).mean()

#### Output ####
Order Date
1    90.846839
2     1.378571

【讨论】:

以上是关于pandas 重新采样以获得具有时间序列数据的月平均值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 数据框:使用线性插值重新采样

Pandas Dataframe 时间序列重新采样,如何修改 bin 以适应底层数据集的开始和结束时间

当所有值都是 NaN 时,Pandas 重新采样以返回 NaN

合并两个 Pandas 数据帧,在一个时间列上重新采样,插值

根据日期创建每月重新采样的 Pandas DataFrame

使用“bin size”/“frequency”重新采样 Pandas Dataframe