asfreq和resample之间的区别

发布于 2021-01-29 15:18:53

能否请您解释一下asfreq和resample方法在熊猫中的区别?什么时候应该使用什么?

关注者
0
被浏览
206
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    让我用一个例子来说明:

    # generate a series of 365 days
    # index = 20190101, 20190102, ... 20191231
    # values = [0,1,...364]
    ts = pd.Series(range(365), index = pd.date_range(start='20190101', 
                                                    end='20191231',
                                                    freq = 'D'))
    ts.head()
    
    output:
    2019-01-01    0
    2019-01-02    1
    2019-01-03    2
    2019-01-04    3
    2019-01-05    4
    Freq: D, dtype: int64
    

    现在,按季度重新采样数据:

    ts.asfreq(freq='Q')
    
    output:
    2019-03-31     89
    2019-06-30    180
    2019-09-30    272
    2019-12-31    364
    Freq: Q-DEC, dtype: int64
    

    asfreq()返回一个Series与每个季度在它的最后一天对象。

    ts.resample('Q')
    
    output:
    DatetimeIndexResampler [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=start, base=0]
    

    重新采样返回a DatetimeIndexResampler,您将看不到实际内容。将其视为groupby方法。它创建一个bins(组)列表:

    bins = ts.resample('Q')
    bin.groups
    
    output:
     {Timestamp('2019-03-31 00:00:00', freq='Q-DEC'): 90,
     Timestamp('2019-06-30 00:00:00', freq='Q-DEC'): 181,
     Timestamp('2019-09-30 00:00:00', freq='Q-DEC'): 273,
     Timestamp('2019-12-31 00:00:00', freq='Q-DEC'): 365}
    

    到目前为止,除了返回类型外,没有什么不同。让我们计算每个季度的平均值:

    # (89+180+272+364)/4 = 226.25
    ts.asfreq(freq='Q').mean()
    
    output:
    226.25
    

    mean()施加时,它输出平均的所有值。请注意,这不是每个季度的平均值,而是每个季度最后一天的平均值。

    要计算每个季度的平均值:

    ts.resample('Q').mean()
    
    output:
    2019-03-31     44.5
    2019-06-30    135.0
    2019-09-30    226.5
    2019-12-31    318.5
    

    您可以执行功能更强的操作resample()asfreq()

    想想resamplegroupby+每一个方法,你可以调用后groupby(例如,平均值,总和,应用,你的名字)。

    可以将其asfreq视为fillna()功能有限的过滤器机制(在fillna()中,您可以指定limit,但asfreq()不支持它)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看