如何基于Pandas DataFrame为每个用户生成2019年365天时间序列?
实现方法
核心思路
通过生成2019年全量日期、构建用户-日期笛卡尔积、合并已有数据并填充缺失值三个核心步骤,为每个用户生成365天的score时间序列。
代码实现
先给出示例输入数据,再逐步完成处理:
import pandas as pd # 示例输入数据 df_t = pd.DataFrame({ 'id': [1,2,3,4,5], 'user_id': [101,101,102,103,101], 'timestamp': ['2019-01-01', '2019-01-03', '2018-12-31', '2019-05-20', '2020-02-10'], 'score': [85, 90, 78, 92, 88] }) df_u = pd.DataFrame({ 'user_id': [101,102,103] }) # 1. 生成2019年全年日期序列 dates_2019 = pd.date_range(start='2019-01-01', end='2019-12-31', freq='D') df_dates = pd.DataFrame({'date': dates_2019}) # 2. 预处理df_t:仅保留2019年数据,确保(user_id, 日期)唯一 df_t['date'] = pd.to_datetime(df_t['timestamp']).dt.date # 筛选2019年有效记录 df_t_2019 = df_t[(pd.to_datetime(df_t['date']) >= '2019-01-01') & (pd.to_datetime(df_t['date']) <= '2019-12-31')] # 同一天同一用户多条数据时保留第一条,如需聚合可改用groupby+agg(如mean/max) df_t_unique = df_t_2019.drop_duplicates(subset=['user_id', 'date'], keep='first')[['user_id', 'date', 'score']] # 3. 构建用户-日期笛卡尔积:每个用户匹配365天 df_u['temp_key'] = 1 df_dates['temp_key'] = 1 df_user_dates = df_u.merge(df_dates, on='temp_key').drop('temp_key', axis=1) df_user_dates['date'] = df_user_dates['date'].dt.date # 统一日期格式 # 4. 合并数据并填充缺失值 df_result = df_user_dates.merge(df_t_unique, on=['user_id', 'date'], how='left') df_result['score'] = df_result['score'].fillna(-1) # 5. 整理为每个用户的365长度时间序列 user_series = df_result.groupby('user_id')['score'].apply(list).reset_index() user_series.columns = ['user_id', '2019_score_series'] print(user_series)
预期输出
user_id 2019_score_series 0 101 [85.0, -1.0, 90.0, -1.0, -1.0, -1.0, -1.0, -1... 1 102 [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1... 2 103 [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1...
细节说明
- 若df_t中存在同一用户同一天多条score记录,可将
drop_duplicates替换为聚合逻辑,例如df_t_2019.groupby(['user_id', 'date'])['score'].mean().reset_index() - 若原始timestamp为数值型时间戳,可改用
pd.to_datetime(df_t['timestamp'], unit='s')转换格式 - 最终序列严格按2019年1月1日至12月31日的顺序排列,符合时间序列要求
内容的提问来源于stack exchange,提问作者JayJona
相关产品推荐
相关产品推荐

