如何按用户ID提取时序数据中每2天周期的最后值至新列?
按用户ID提取2天周期最后值生成新列的实现方案
需求说明
现有带2日求和列的时间序列数据,需按uid(用户ID)分组,提取每个2天周期的最后cols值,写入新列new。示例数据如下:
timestamp uid cols new 2020-10-10 00:00 1 10 2020-10-10 00:00 2 5 2020-10-10 00:10 1 20 2020-10-10 00:10 2 20 2020-10-10 00:20 1 40 .... 2020-10-11 23:50 1 3400 2020-10-11 23:50 2 5250 2020-10-12 00:00 1 20 3400 2020-10-12 00:00 2 15 5250
实现步骤(基于Pandas)
1. 数据预处理
先确保时间列格式正确,并按用户ID和时间排序:
import pandas as pd # 转换timestamp为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 按uid和时间升序排序,保证时序逻辑正确 df = df.sort_values(['uid', 'timestamp'])
2. 为每行分配周期标签
按uid分组,将时间划分为连续的2天周期,给每行打上周期标识:
# 为单个用户的时间序列分配2天周期标签 def assign_period(x): # 生成覆盖该用户所有数据的2天间隔边界 bins = pd.date_range(start=x.min(), end=x.max() + pd.Timedelta(days=2), freq='2D') # 为每个时间点匹配对应的周期 return pd.cut(x, bins=bins, labels=False, include_lowest=True) df['period'] = df.groupby('uid')['timestamp'].transform(assign_period)
3. 提取周期最后值并映射到新列
计算每个用户+周期的最后cols值,将其映射到下一个周期的行中:
# 提取每个周期的最后cols值 period_last = df.groupby(['uid', 'period'])['cols'].last().reset_index() # 将周期标签+1,让当前周期的最后值对应到下一个周期 period_last['period'] += 1 # 合并到原数据表,生成new列 df = df.merge(period_last, on=['uid', 'period'], how='left', suffixes=('', '_new')) # 重命名列并整理输出结构 df.rename(columns={'cols_new': 'new'}, inplace=True) df = df[['timestamp', 'uid', 'cols', 'new']]
执行后即可得到示例中的目标结果:每个新2天周期的行,new列会填充上一个周期的最后cols值,其余行保持空值。
内容的提问来源于stack exchange,提问作者prof32
相关产品推荐
相关产品推荐

