基于年中天数为指定日期及ID回填值的Python实现求助
解决方案:基于Pandas实现按ID回填全年日期值
1. 生成目标年份的完整日期序列
首先从原数据中提取目标年份,生成该年份的所有日期记录,并添加dayofyear字段用于后续匹配:
import pandas as pd # 从原数据提取目标年份(若数据跨多年,需自行指定年份) target_year = data['Date'].dt.year.unique()[0] # 生成全年每日日期 full_dates = pd.date_range(start=f"{target_year}-01-01", end=f"{target_year}-12-31", freq='D') full_date_df = pd.DataFrame({'Date': full_dates}) full_date_df['dayofyear'] = full_date_df['Date'].dt.dayofyear
2. 构建每个ID的全年日期框架
为每个唯一ID生成对应的全年日期数据,确保每个ID都有365/366条日期记录:
# 获取所有唯一ID unique_ids = data['id'].unique() # 为每个ID生成全年日期数据 id_full_dfs = [] for uid in unique_ids: temp_df = full_date_df.copy() temp_df['id'] = uid id_full_dfs.append(temp_df) # 合并为完整的ID-日期全量框架 full_id_date = pd.concat(id_full_dfs, ignore_index=True)
3. 合并原数据并回填缺失值
根据你的业务需求选择对应的填充方式:
场景A:按ID用最近的非空值填充(适用于阶段性更新的values)
如果ID的values是在特定日期更新,需要将值延续到下一次更新前的所有日期:
# 合并原数据与全量框架 merged_df = pd.merge(full_id_date, data[['Date', 'id', 'values']], on=['Date', 'id'], how='left') # 按ID分组,先前向填充再后向填充,确保全年无缺失(若ID至少有一个有效值) merged_df['values'] = merged_df.groupby('id')['values'].apply(lambda x: x.ffill().bfill())
场景B:每个ID仅对应一个值,直接填充全年
如果每个ID只有一条有效数据,直接将该值映射到全年所有日期:
# 构建ID与values的映射字典 id_value_map = data.drop_duplicates('id').set_index('id')['values'].to_dict() # 为全量框架填充values full_id_date['values'] = full_id_date['id'].map(id_value_map)
4. 整理最终结果
按ID和日期排序,按需调整列结构:
# 排序并重置索引 final_result = merged_df.sort_values(by=['id', 'Date']).reset_index(drop=True) # 可选:移除dayofyear字段(若无需保留) final_result = final_result.drop('dayofyear', axis=1)
内容的提问来源于stack exchange,提问作者RPyML
相关产品推荐
相关产品推荐

