返回

指定频率数据聚合指南:巧用Pandas的groupby和resample函数

python

如何按指定频率聚合数据

背景

在数据分析中,将数据聚合到时间窗口中对于揭示趋势和模式至关重要。Pandas 库的 rolling 函数提供了这一功能,但对于需要按指定频率聚合数据的情况,它却无能为力。

问题陈述

如果你有一个包含时间戳和相应数据记录的数据框,并且希望以特定频率(例如每 2 秒)对这些记录进行分组,该怎么办?rolling 函数不支持基于固定步长的非重叠窗口。

解决方案

尽管 rolling 函数不直接支持此用例,但我们可以通过 groupbyresample 函数的巧妙组合来实现所需的行为。

步骤

1. 按时间分组:

使用 groupby 函数按时间列将数据框分组,创建一组时间组。

2. 重新采样:

使用 resample 函数对每个时间组进行重新采样,以创建指定频率的窗口。

3. 应用聚合函数:

对每个窗口应用所需的聚合函数,例如求和、平均或求中值。

代码示例

# 创建一个示例数据框
times = pd.date_range(start=pd.Timestamp.now(), end=pd.Timestamp.now() + pd.Timedelta(minutes=1), periods=61)
data = np.arange(61)
df = pd.DataFrame({'times': times, 'data': data})

# 按时间分组
groups = df.groupby('times')

# 以指定频率重新采样
resampled_groups = groups.resample('2S')

# 应用聚合函数
result = resampled_groups.mean()

输出

                   data
times                
2024-03-20 10:38:44   0.0
2024-03-20 10:38:46   1.5
2024-03-20 10:38:48   3.0
2024-03-20 10:38:50   4.5
2024-03-20 10:38:52   6.0
...                 ...
2024-03-20 10:39:40  54.0
2024-03-20 10:39:42  56.5
2024-03-20 10:39:44  59.0
2024-03-20 10:39:46  60.5
2024-03-20 10:39:48  62.0

优点

  • 对窗口长度和步长的完全控制
  • 支持不规则数据
  • 利用标准 Pandas 功能实现,简单易行

缺点

  • 对于大型数据集,可能需要更多计算时间
  • 必须手动指定窗口长度和步长

结论

通过将 groupbyresample 函数相结合,我们可以克服 rolling 函数的局限性,按指定频率聚合数据,即使对于不规则数据也是如此。这种方法为时间序列分析和数据挖掘任务提供了更大的灵活性。

常见问题解答

  • 我可以在不使用 resample 函数的情况下实现同样的行为吗?

    不,resample 函数对于创建指定频率的非重叠窗口至关重要。

  • 这种方法是否也适用于不规则数据?

    是的,这种方法对于处理不规则数据非常有效,因为它不依赖于时间戳的任何特定频率。

  • 是否可以按多个时间列分组?

    是的,你可以使用 groupby 函数按多个时间列进行分组,以创建更复杂的窗口。

  • 如何处理重复的时间戳?

    在重新采样之前,使用 drop_duplicates 函数删除重复的时间戳至关重要,否则会导致聚合结果不准确。

  • 这种方法是否比 rolling 函数更有效率?

    对于大型数据集,rolling 函数通常比这种方法更有效率,但对于指定频率的非重叠窗口,它是不合适的。