如何在Python中实现动态时间间隔(如20分钟)的数据聚合
解决方案:用Pandas实现时间间隔聚合与宽表转换
针对你的需求,我们可以用Pandas完成从时间分组聚合到宽表转换的完整流程,以下是可直接运行的代码示例,适配10/20/30分钟的动态时间间隔:
步骤1:数据准备与预处理
首先加载数据并将TimeStamp转换为datetime类型,这是时间聚合的前提:
import pandas as pd import numpy as np # 加载原始数据 data = pd.DataFrame({ 'TimeStamp': ['2022-01-01 00:00:02.969', '2022-01-01 00:00:04.467', '2022-01-01 00:00:05.965', '2022-01-01 00:00:08.962', '2022-01-01 00:00:10.461'], 'Name': ['Chris', 'Chris', 'Mark', 'Cuban', 'Cuban'], 'Marks': [70, 75, 80, 60, 58], 'Subject': ['DK', 'DK', 'DK', 'DK', 'DK'] }) # 将TimeStamp转为datetime类型 data['TimeStamp'] = pd.to_datetime(data['TimeStamp'])
步骤2:按时间间隔分组聚合
使用pd.Grouper指定时间间隔(freq参数:10分钟用'10T',20分钟用'20T',30分钟用'30T'),同时按Subject和Name分组,计算Min、Max、STD:
# 定义时间间隔,可动态调整 time_interval = '20T' # 替换为'10T'或'30T'即可 # 分组聚合 aggregated = data.groupby([ pd.Grouper(key='TimeStamp', freq=time_interval, label='left'), # 取区间左边界作为时间戳 'Subject', 'Name' ])['Marks'].agg([ ('Min', 'min'), ('Max', 'max'), ('STD', lambda x: x.std() if len(x)>=2 else np.nan) # 样本量小于2时STD设为NaN ]).reset_index()
注:用label='left'确保时间戳显示为每个区间的起始时间(如2022-01-01 00:00:00.000),STD计算时判断样本量是避免单数据点无标准差的情况。
步骤3:转换为宽表格式
用pivot将长表转为你需要的宽表,并重命名列名:
# 转宽表 wide_table = aggregated.pivot( index=['TimeStamp', 'Subject'], columns='Name', values=['Min', 'Max', 'STD'] ) # 调整列名格式为"Name_Stat" wide_table.columns = [f'{name}_{stat}' for stat, name in wide_table.columns] # 重置索引并格式化时间戳到毫秒 wide_table = wide_table.reset_index() wide_table['TimeStamp'] = wide_table['TimeStamp'].dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] # 保留三位毫秒 # 填充空值为空白(可选,根据需求调整) wide_table = wide_table.fillna('')
最终输出结果
运行上述代码后,针对你的示例数据,输出的宽表如下:
| TimeStamp | Subject | Chris_Min | Chris_Max | Chris_STD | Cuban_Min | Cuban_Max | Cuban_STD | Mark_Min | Mark_Max | Mark_STD |
|---|---|---|---|---|---|---|---|---|---|---|
| 2022-01-01 00:00:00.000 | DK | 70 | 75 | 3.5355 | 58 | 60 | 1.4142 | 80 | 80 |
如果后续有其他时间区间的数据,代码会自动按设定的时间间隔生成对应的行。
内容的提问来源于stack exchange,提问作者Divyansh Kumar Singh
相关产品推荐
相关产品推荐

