使用Pandas外推潜在蒸发量时间序列至1975年
日潜在蒸发量时间序列扩展解决方案
核心逻辑
基于现有11年数据计算的日度基准统计值(min、mean、0.9分位数、max),将其映射到1975年至今的每一个对应日期(含闰年2月29日处理),生成完整时间序列。
分步实现代码
1. 规整基准统计数据
假设你已通过groupby得到基准年的日度统计数据,先将其索引统一为一年中的第几天(dayofyear,适配闰年):
# 若基准数据索引是仅含月日的datetime格式,提取dayofyear df_baseline['dayofyear'] = df_baseline.index.dayofyear # 按dayofyear聚合,确保每个日序对应唯一统计值 df_baseline = df_baseline.groupby('dayofyear').first()
2. 创建目标时间范围索引
生成1975年至今的完整日度时间索引:
import pandas as pd start = '1975-01-01' end = pd.Timestamp.today().strftime('%Y-%m-%d') target_dates = pd.date_range(start=start, end=end, freq='D')
3. 映射基准值到目标序列
将目标日期的dayofyear与基准数据关联,完成填充:
# 转换目标索引为DataFrame并添加dayofyear列 df_expanded = pd.DataFrame(index=target_dates) df_expanded['dayofyear'] = df_expanded.index.dayofyear # 处理闰年2月29日:若基准数据无366日统计值,用365日的值或全年均值填充 if 366 not in df_baseline.index: df_baseline.loc[366] = df_baseline.loc[365] # 可替换为df_baseline.mean() # 合并基准统计值到扩展序列 df_expanded = df_expanded.join(df_baseline, on='dayofyear')
备选方案:用月日字符串关联
如果基准数据是按(月,日)分组的,可用%m-%d字符串作为关联键:
df_expanded['month_day'] = df_expanded.index.strftime('%m-%d') df_baseline['month_day'] = df_baseline.index.strftime('%m-%d') df_expanded = df_expanded.merge(df_baseline, on='month_day', how='left').set_index(target_dates)
问题排查要点
reindex失败通常是因为目标索引与基准数据索引类型不匹配,统一用dayofyear或%m-%d字符串即可解决- 检查缺失值:执行
df_expanded.isna().sum(),若存在缺失,需补充对应日序的统计值(如用全年均值填充)
内容的提问来源于stack exchange,提问作者Prebbish
相关产品推荐
相关产品推荐

