指定频率数据聚合指南:巧用Pandas的groupby和resample函数
2024-03-23 16:36:46
如何按指定频率聚合数据
背景
在数据分析中,将数据聚合到时间窗口中对于揭示趋势和模式至关重要。Pandas 库的 rolling
函数提供了这一功能,但对于需要按指定频率聚合数据的情况,它却无能为力。
问题陈述
如果你有一个包含时间戳和相应数据记录的数据框,并且希望以特定频率(例如每 2 秒)对这些记录进行分组,该怎么办?rolling
函数不支持基于固定步长的非重叠窗口。
解决方案
尽管 rolling
函数不直接支持此用例,但我们可以通过 groupby
和 resample
函数的巧妙组合来实现所需的行为。
步骤
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 功能实现,简单易行
缺点
- 对于大型数据集,可能需要更多计算时间
- 必须手动指定窗口长度和步长
结论
通过将 groupby
和 resample
函数相结合,我们可以克服 rolling
函数的局限性,按指定频率聚合数据,即使对于不规则数据也是如此。这种方法为时间序列分析和数据挖掘任务提供了更大的灵活性。
常见问题解答
-
我可以在不使用
resample
函数的情况下实现同样的行为吗?不,
resample
函数对于创建指定频率的非重叠窗口至关重要。 -
这种方法是否也适用于不规则数据?
是的,这种方法对于处理不规则数据非常有效,因为它不依赖于时间戳的任何特定频率。
-
是否可以按多个时间列分组?
是的,你可以使用
groupby
函数按多个时间列进行分组,以创建更复杂的窗口。 -
如何处理重复的时间戳?
在重新采样之前,使用
drop_duplicates
函数删除重复的时间戳至关重要,否则会导致聚合结果不准确。 -
这种方法是否比
rolling
函数更有效率?对于大型数据集,
rolling
函数通常比这种方法更有效率,但对于指定频率的非重叠窗口,它是不合适的。
