有人可以解释一下熊猫中 asfreq 和 resample 方法之间的区别吗?什么时候应该使用什么?
2 回答
resample
比 更一般asfreq
。例如,使用resample
I 可以传递任意函数来对任意大小的 bin 中的Series
或对象执行 binning。是改变物体频率的一种简洁方法。它还提供填充功能。DataFrame
asfreq
DatetimeIndex
正如 pandas 文档所说,asfreq
是一个对调用date_range
+ 调用的薄包装reindex
。有关示例,请参见此处。
resample
我在日常工作中使用的一个示例是通过重新采样一个大型布尔数组来计算 1 秒箱中神经元的尖峰数量,其中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
至于何时使用:这取决于您想到的问题...愿意分享吗?
让我用一个例子来说明:
# 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]
Resample 返回 aDatetimeIndexResampler
并且您看不到里面的实际内容。将其视为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()
。
将resample
其视为groupby
+ 您可以在之后调用的每个方法groupby
(例如,均值、求和、应用,您可以命名它)。
将asfreq
其视为功能有限的过滤器机制fillna()
(在 fillna() 中,您可以指定limit
,但 asfreq() 不支持)。