本文共 3179 字,大约阅读时间需要 10 分钟。
时间序列数据的重采样是数据分析中常见且重要的一种操作。通过重采样,我们可以将数据从一个频率转换为另一个频率,从而更方便地进行数据分析和可视化。在pandas中,实现时间序列重采样的核心工具是resample()函数。本文将详细介绍pandas重采样的核心功能、使用方法以及实际应用案例。
时间重采样是一种将数据按一定频率重新组织的技术。常见的重采样方式包括向上采样和向下采样。向上采样是指将数据的时间频率变得更细,如将天转换为分钟、小时等更精细的单位。向下采样则是将数据的时间频率变得更粗,如将天转换为周、月、季度等更粗粒度的单位。
在pandas中,resample()函数是实现时间序列重采样的主要工具。该函数可以对Series和DataFrame对象执行重采样操作。由于重采样默认对索引进行操作,因此索引必须是时间类型,或者通过on参数指定要重采样的时间类型的列。
默认情况下,resample()对索引进行操作。假设索引是时间类型,直接调用函数即可。
df.resample('W')['C_0'].sum().head() 如果不想对索引重采样,可以通过on参数指定时间类型的列。
df = df.reset_index(drop=False, inplace=True)df.resample('W', on='index')['C_0'].sum().head() 通过closed参数可以指定时间频率的左右闭合状态。默认情况下,M、A、Q、BM、BA、BQ、W是右闭合,其余频率默认为左闭合。
df.resample('W', closed='left')['C_0'].sum().head()df.resample('W', closed='right')['C_0'].sum().head() 通过label参数可以指定输出结果的标签。默认为右边界,通过设置label='left'可以更改为左边界。
df.resample('W', label='left')['C_0'].sum().head()df.resample('W', label='right')['C_0'].sum().head() 重采样后可以对多个列进行聚合统计。例如,采用agg()函数对多个列进行多种聚合操作。
df.resample('W').agg({ 'C_0': ['sum', 'mean'], 'C_1': lambda x: np.std(x, ddof=1)}).head() 通过对rule参数指定更细粒度的频率,可以实现上采样。例如,将天转换为12小时频率。
df.resample('12H')['C_0'].sum().head() 在上采样过程中,可能会出现数据缺失。通过ffill()、bfill()、nearest()等函数可以对缺失数据进行填充。
df.resample('8H')['C_0'].ffill(limit=1).head()df.resample('8H')['C_0'].bfill(limit=1).head()df.resample('8H')['C_0'].nearest(limit=1).head() 除了上述填充方法,还可以使用fillna()函数进行混合填充。
df.resample('8H')['C_0'].fillna(method='pad', limit=1).head()df.resample('8H')['C_0'].asfreq(-999).head() 通过interpolate()函数可以对缺失数据进行高级插值填充。
df.resample('8H').interpolate(method='linear').applymap(lambda x: round(x, 2)).head() 通过agg()函数可以对多个列进行多种聚合操作。例如,计算多个列的统计量并进行组合。
df.resample('W').agg({ 'C_0': ['sum', 'mean'], 'C_1': lambda x: x.max() - x.min()}).head() apply()函数可以对重采样后的数据执行自定义函数,适用于需要灵活处理的场景。
def agg_func(x): names = { 'C_0_mean': round(x['C_0'].mean(), 2), 'C_1_sum': x['C_1'].sum(), 'C_2_max': x['C_2'].max(), 'C_3_mean_plus1': round(x['C_3'].mean() + 1, 2) } return pd.Series(names, index=[key for key in names.keys()])df.resample('W').apply(agg_func).head() transform()函数可以对重采样后的数据执行组内转换操作,不改变原索引结构。
df['C_0_cumsum'] = df.resample('W')['C_0'].transform('cumsum')df['C_0_rank'] = df.resample('W')['C_0'].transform('rank')df.head(10) pipe()函数可以对重采样后的resampler对象执行链式操作,提升代码可读性和效率。
df['cumsum_delta'] = df.resample('W')['C_0', 'C_1'] \ .pipe(lambda x: x.cumsum()) \ .pipe(lambda x: x['C_1'] - x['C_0'])df.head(10) 通过本文的介绍,已经掌握了pandas中时间序列重采样的核心概念和实际操作方法。无论是向上采样还是向下采样,resample()函数都提供了强大的功能,能够满足多种数据分析场景的需求。在实际应用中,可以根据具体需求灵活配置rule、closed、label等参数,对时间序列数据进行精细化处理。
转载地址:http://jsvfk.baihongyu.com/