
在数据分析中,我们经常需要对时间序列数据进行周期性分组,例如按小时、天、周或月进行聚合。pandas库提供了强大的工具来处理这类任务,其中pd.grouper是进行时间序列分组的核心功能之一。然而,在使用pd.grouper配合freq='24h'进行24小时分组时,一个常见的误解是它会从数据中的第一个时间戳开始,每隔24小时创建一个分组。实际上,pd.grouper的默认行为是根据日历日(即从每个日期的午夜00:00:00开始)进行分组,即使指定的频率是'24h'。
例如,如果数据从2023-11-18 17:00:00开始,默认的24H分组会从2023-11-18 00:00:00开始计算,导致第一个分组可能只包含2023-11-18 17:00:00到2023-11-18 23:59:59的数据,而不是从2023-11-18 17:00:00到2023-11-19 16:59:59的完整24小时周期。本教程的目标正是解决这一问题,指导用户如何实现灵活的、以数据首个时间戳为起点的24小时周期分组。
pd.Grouper是Pandas中用于对DataFrame或Series进行时间序列分组的关键对象。它允许用户通过指定键(通常是时间戳列)和频率来定义分组规则。
为了更好地说明origin参数的作用,我们将通过一个具体的例子来演示。
首先,我们创建一个模拟的DataFrame,其中包含每小时生成的时间戳和一些测量值。
import pandas as pd
import numpy as np
# 创建一个从2023-12-01 17:00到2023-12-02 17:00的日期时间范围
dti = pd.date_range('2023-12-01 17:00', '2023-12-02 17:00', freq='1H')
# 创建一个DataFrame
df = pd.DataFrame({'created_at': dti, 'moisture': np.random.randint(500, 550, len(dti))})
print("原始DataFrame:")
print(df.head())
print("...")
print(df.tail())输出的DataFrame将包含从2023-12-01 17:00:00开始的数据点。
原始DataFrame:
created_at moisture
0 2023-12-01 17:00:00 513
1 2023-12-01 18:00:00 520
2 2023-12-01 19:00:00 535
3 2023-12-01 20:00:00 533
4 2023-12-01 21:00:00 516
...
created_at moisture
20 2023-12-02 13:00:00 532
21 2023-12-02 14:00:00 520
22 2023-12-02 15:00:00 514
23 2023-12-02 16:00:00 528
24 2023-12-02 17:00:00 545首先,我们演示不指定origin参数(即使用默认值'start_day')时pd.Grouper的行为。
print("\n--- 默认分组 (origin='start_day') ---")
df_groupby_default = df.groupby(pd.Grouper(key='created_at', freq='24H')).size()
print(df_groupby_default)输出结果:
--- 默认分组 (origin='start_day') --- created_at 2023-12-01 7 # 从 2023-12-01 00:00:00 到 2023-12-01 23:59:59 2023-12-02 18 # 从 2023-12-02 00:00:00 到 2023-12-02 23:59:59 Freq: 24H, dtype: int64
从输出可以看出,第一个分组的起始时间是2023-12-01 00:00:00,它包含了当天所有数据(即从17:00:00到23:00:00的7个数据点)。第二个分组从2023-12-02 00:00:00开始,包含了2023-12-02当天的数据。这显然不是我们期望的从数据起始时间开始的24小时周期。
现在,我们使用origin='start'参数来修正分组行为,使其从DataFrame的第一个时间戳开始计算24小时周期。
print("\n--- 自定义分组 (origin='start') ---")
df_groupby_custom = df.groupby(pd.Grouper(key='created_at', freq='24H', origin='start')).size()
print(df_groupby_custom)输出结果:
--- 自定义分组 (origin='start') --- created_at 2023-12-01 17:00:00 24 # 从 2023-12-01 17:00:00 到 2023-12-02 16:59:59 2023-12-02 17:00:00 1 # 从 2023-12-02 17:00:00 到 2023-12-03 16:59:59 Freq: 24H, dtype: int64
通过设置origin='start',我们可以看到分组的起始时间变成了2023-12-01 17:00:00,这与我们数据中的第一个时间戳完全一致。第一个分组包含了从2023-12-01 17:00:00到2023-12-02 16:59:59共24个数据点,完美地形成了我们期望的24小时周期。第二个分组从2023-12-02 17:00:00开始,包含了剩余的1个数据点。
除了groupby结合pd.Grouper,Pandas的resample方法也提供了类似的功能,并且同样支持origin参数。resample通常用于时间序列的重采样和聚合。
print("\n--- 使用 resample 方法 (origin='start') ---")
df_resample_custom = df.resample(rule='24H', on='created_at', origin='start').size()
print(df_resample_custom)输出结果:
--- 使用 resample 方法 (origin='start') --- created_at 2023-12-01 17:00:00 24 2023-12-02 17:00:00 1 Freq: 24H, dtype: int64
可以看到,resample方法通过设置origin='start'也实现了与pd.Grouper相同的结果。在实际应用中,resample通常更简洁,尤其当时间列已经是DataFrame的索引时。
在使用pd.Grouper或resample进行时间序列分组时,有几个关键点需要注意:
在Pandas中对时间序列数据进行24小时周期分组时,理解pd.Grouper(或resample)的origin参数至关重要。默认情况下,freq='24H'会基于日历日(午夜)进行分组,这可能不符合从数据起始点开始计算固定24小时周期的需求。通过明确设置origin='start',我们可以精确地将分组的起始点锚定到数据集中的第一个时间戳,从而实现真正意义上的、日期无关的24小时周期分组。掌握这一技巧,将大大提升您在处理复杂时间序列数据时的灵活性和准确性。
以上就是Pandas时间序列分组:实现基于数据起始时间的24小时周期分组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号