首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asfreq和resample之间的区别

asfreq和resample之间的区别
EN

Stack Overflow用户
提问于 2013-08-05 22:23:48
回答 2查看 16.9K关注 0票数 48

能解释一下大熊猫的asfreq和重采样方法的区别吗?什么时候应该用什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-05 19:30:29

让我用一个例子来说明:

代码语言:javascript
复制
# 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

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

代码语言:javascript
复制
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对象,其中包含每个季度的最后一天。

代码语言:javascript
复制
ts.resample('Q')

output:
DatetimeIndexResampler [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=start, base=0]

Resample返回一个DatetimeIndexResampler,你看不到里面的实际内容。可以将其视为groupby方法。它创建了一个bins (组)列表:

代码语言:javascript
复制
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}

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

代码语言:javascript
复制
# (89+180+272+364)/4 = 226.25
ts.asfreq(freq='Q').mean()

output:
226.25

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

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

代码语言:javascript
复制
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

You can perform more powerful operations with resample()而不是asfreq()

resample想象成groupby +你可以在groupby之后调用的所有方法(例如,mean,sum,apply,你可以给它命名)。

可以将asfreq看作是一种具有有限填充功能的过滤机制(在fillna() ()中,您可以指定limit,但asfreq()不支持它)。

票数 23
EN

Stack Overflow用户

发布于 2013-08-05 22:54:41

resampleasfreq更通用。例如,使用resample,我可以传递一个任意函数,在任意大小的bin中对SeriesDataFrame对象执行装箱。asfreq是一种更改DatetimeIndex对象频率的简明方法。它还提供填充功能。

正如pandas文档所说,asfreq是对date_range的调用+对reindex的调用的一个薄包装器。有关示例,请参阅here

我在日常工作中使用的resample的一个例子是通过对一个大型布尔数组进行重采样来计算一个神经元在1秒内的尖峰数组,其中True表示“尖峰”,False表示“没有尖峰”。我可以像large_bool.resample('S', how='sum')一样简单地做到这一点。挺整洁的!

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

下面是一个示例,说明它们是等效的:

代码语言:javascript
复制
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

至于什么时候使用:这取决于你在mind...care中有什么问题要分享?

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18060619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档