asfreq和resample之间的区别

psy*_*lik 34 python pandas

有人可以解释一下pandas中asfreq和resample方法之间的区别吗?什么时候应该使用什么?

Phi*_*oud 35

resample比一般更普遍asfreq.例如,使用resampleI可以传递任意函数来对任意大小的bin中的对象SeriesDataFrame对象执行binning .asfreq是一种改变DatetimeIndex对象频率的简洁方法.它还提供填充功能.

正如pandas文档所说,asfreq是一个围绕调用date_range+调用的瘦包装器reindex.请看这里的例子.

resample我在日常工作中使用的一个例子是通过重新采样一个大的布尔数组来计算一秒钟内神经元的尖峰数,其中True意味着"尖峰"并且False意味着"没有尖峰".我能做到这一点很简单large_bool.resample('S', how='sum').有点整洁!

asfreq当您想要更改a DatetimeIndex以具有不同的频率同时在当前索引处保留相同的值时,可以使用此选项.

这是一个等价的例子:

In [6]: dr = date_range('1/1/2010', periods=3, freq=3 * datetools.bday)

In [7]: raw = randn(3)

In [8]: ts = Series(raw, index=dr)

In [9]: ts
Out[9]:
2010-01-01   -1.948
2010-01-06    0.112
2010-01-11   -0.117
Freq: 3B, dtype: float64

In [10]: ts.asfreq(datetools.BDay())
Out[10]:
2010-01-01   -1.948
2010-01-04      NaN
2010-01-05      NaN
2010-01-06    0.112
2010-01-07      NaN
2010-01-08      NaN
2010-01-11   -0.117
Freq: B, dtype: float64

In [11]: ts.resample(datetools.BDay())
Out[11]:
2010-01-01   -1.948
2010-01-04      NaN
2010-01-05      NaN
2010-01-06    0.112
2010-01-07      NaN
2010-01-08      NaN
2010-01-11   -0.117
Freq: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)

至于什么时候使用:它取决于你想到的问题......关心分享?


Che*_*eng 8

让我用一个例子来说明:

# 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

ts.resample('Q')

output:
DatetimeIndexResampler [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=start, base=0]
Run Code Online (Sandbox Code Playgroud)

重新采样返回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}
Run Code Online (Sandbox Code Playgroud)

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

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

output:
226.25
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

可以将+ resample视为groupby可以调用的每种方法groupby(例如,均值,求和,应用,命名)。

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