如何按用户分组将带时间戳的数据转换为10分钟粒度时间序列
按用户拆分的10分钟粒度时间序列转换方案
核心思路
按用户ID分组,为每个用户单独生成覆盖其所有数据时间范围的10分钟间隔时间序列,再将原数据与该序列对齐,缺失值填充为NaN,最后按用户ID顺序拼接结果。
代码实现(基于Pandas)
import pandas as pd # 构造示例数据(实际使用时可替换为pd.read_csv读取文件) df = pd.DataFrame({ 'timestamp': ['2020-01-01 10:00', '2020-01-01 10:04', '2020-01-01 20:02', '2020-01-01 21:20', '2020-01-15 23:12'], 'uid': [1, 2, 2, 1, 1], 'var': [10, 20, 15, 10, 5] }) # 转换时间列为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 定义单个用户数据的重采样函数 def process_user_group(group): # 获取该用户时间范围的10分钟对齐起止点 start = group['timestamp'].min().floor('10min') end = group['timestamp'].max().floor('10min') # 生成10分钟间隔的时间序列 time_seq = pd.date_range(start=start, end=end, freq='10min') # 将原数据时间向下取整到10分钟,用于匹配 group['aligned_time'] = group['timestamp'].dt.floor('10min') # 合并生成的时间序列与原数据,填充缺失值 resampled_df = pd.DataFrame({ 'timestamp': time_seq, 'uid': group['uid'].iloc[0] }).merge( group[['aligned_time', 'var']], left_on='timestamp', right_on='aligned_time', how='left' ).drop('aligned_time', axis=1) return resampled_df # 按uid分组处理,按uid升序拼接结果 final_result = df.groupby('uid', sort=True).apply(process_user_group).reset_index(drop=True) # 查看结果示例 print(final_result.head(10))
代码说明
- 时间类型转换:确保
timestamp列是datetime格式,这是时间序列处理的基础 - 分组处理:通过
groupby('uid', sort=True)保证按用户ID顺序处理 - 时间序列生成:用
pd.date_range生成每个用户专属的10分钟间隔时间轴,起止点取该用户最早/最晚数据的10分钟对齐点 - 数据对齐:将原数据时间向下取整后与生成的时间轴合并,未匹配到的
var自动填充为NaN
输出示例
timestamp uid var 0 2020-01-01 10:00:00 1 10.0 1 2020-01-01 10:10:00 1 NaN 2 2020-01-01 10:20:00 1 NaN 3 2020-01-01 10:30:00 1 NaN 4 2020-01-01 10:40:00 1 NaN 5 2020-01-01 10:50:00 1 NaN 6 2020-01-01 11:00:00 1 NaN 7 2020-01-01 11:10:00 1 NaN 8 2020-01-01 11:20:00 1 NaN 9 2020-01-01 11:30:00 1 NaN ... 1727 2020-01-15 23:10:00 1 5.0 1728 2020-01-01 10:00:00 2 20.0 1729 2020-01-01 10:10:00 2 NaN ...
内容的提问来源于stack exchange,提问作者prof31
相关产品推荐
相关产品推荐

