You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于年中天数为指定日期及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:24:59