resample函数用法

resample函数用法

resample 函数用法详解

一、概述

resample 是数据分析和处理中常用的一个函数,特别是在时间序列分析中。它主要用于对时间序列数据进行重新采样,即按照指定的频率对数据进行上采样(interpolation)或下采样(decimation)。resample 函数通常出现在 pandas 的 DataFrame 或 Series 对象中,是处理时间序列数据时不可或缺的工具之一。

二、基本语法

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=None, on=None) Series.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=None, on=None)
  • 参数说明
    • rule:字符串或 Timedelta 对象,表示新的采样频率。例如,'D' 表示日,'H' 表示小时,'T' 或 'min' 表示分钟等。
    • how:字符串或可调用对象,指定如何聚合数据。对于 DataFrame,可以是如 'mean', 'sum', 'ohlc' 等;对于 Series,通常是 'mean', 'sum', 'first', 'last' 等。在新版本中,建议使用 agg 方法代替 how 参数进行更复杂的聚合操作。
    • axis:{0 或 'index', 1 或 'columns'},默认为 0。表示操作的轴向。
    • fill_method:{'pad', 'ffill', 'bfill', None},用于填充缺失值的方法。
    • closed:{'left', 'right'},定义区间的哪一端是闭合的。
    • label:{'left', 'right', 'interval midpoints'},设置返回的时间戳标签的位置。
    • convention:{'start', 'end', 's', 'e'},与 label 类似,但主要用于兼容旧版本。
    • kind:{'timestamp', 'period'},指定重采样的方式是基于时间戳还是时间段。
    • loffset:timedelta 对象,表示在结果标签上进行偏移的量。
    • limit:整数,限制需要聚合的条目数量。
    • base:整数,用于调整重采样的起始点。
    • on:字符串,指定用作时间的列名。如果 DataFrame 没有 DatetimeIndex,则必须指定此参数。

三、示例

  1. 基础使用

    假设我们有一个按分钟记录的数据集,我们希望将其转换为每小时的记录,并计算每个小时的平均值。

    import pandas as pd import numpy as np # 创建示例数据集 rng = pd.date_range('2023-01-01', periods=1440, freq='T') # 生成从2023-01-01开始的1440个时间点(每分钟一次) ts = pd.Series(np.random.randn(len(rng)), index=rng) # 随机生成数值作为数据 # 重新采样为每小时的平均值 resampled_ts = ts.resample('H').mean() print(resampled_ts.head())
  2. 使用 agg 进行复杂聚合

    有时我们需要进行更复杂的聚合操作,比如同时计算最大值和最小值。这时可以使用 agg 方法。

    # 重新采样并使用 agg 方法进行复杂聚合 resampled_df = ts.to_frame('value').resample('H').agg({'value': ['max', 'min']}) print(resampled_df.head())
  3. 指定时间列进行重采样

    当 DataFrame 的索引不是时间戳时,可以通过 on 参数指定时间列。

    # 创建包含时间列的示例 DataFrame data = { 'time': pd.date_range('2023-01-01', periods=1440, freq='T'), 'value': np.random.randn(1440) } df = pd.DataFrame(data).set_index('time') # 将时间列重置为非索引列,然后使用 on 参数进行重采样 df_reset = df.reset_index() resampled_df_reset = df_reset.resample('H', on='time').mean() print(resampled_df_reset.head())

四、注意事项

  • 在使用 resample 时,确保时间序列数据的索引是 DatetimeIndex 类型,否则需要通过 set_index 或 pd.to_datetime 转换。
  • 对于大数据集,重采样可能会消耗较多内存和时间,因此在实际应用中需根据具体情况进行优化。
  • 在新版本中,推荐使用 agg 方法替代 how 参数进行聚合操作,因为 agg 提供了更灵活和强大的功能。