如何用DataFrame B补全DataFrame A中缺失的年度首日气象数据?
解决DataFrame补全年首日缺失数据的问题
问题说明
我有两个DataFrame(A和B):
- DataFrame A包含2010至2013年的气象数据,但每年的1月1日数据行均缺失
- DataFrame B中保存了这些缺失的首日数据
需要为DataFrame A添加缺失日期的行并填入DataFrame B中的对应数据,覆盖所有B中包含的年份。
DataFrame A示例
TIMESTAMP SR TEMP2MMAX TEMP2MMIN PRECIP 0 2013-01-02 10.90 -6.33 -15.78 0.00 1 2013-01-03 10.93 0.20 -16.25 2.54 2 2013-01-04 11.19 -1.25 -15.91 0.51 3 2013-01-05 11.38 0.67 -19.19 0.00 4 2013-01-06 11.36 2.90 -13.49 0.00 ... ... ... ... ... ... 359 2013-12-27 11.26 14.48 -6.43 0.00 360 2013-12-28 11.41 15.77 -6.73 0.00 361 2013-12-29 11.51 15.33 -6.30 0.00 362 2013-12-30 7.40 -3.06 -12.48 0.00 363 2013-12-31 11.33 11.21 -11.87 0.00 364 rows × 5 columns
DataFrame B示例
DATE SRAD TMAX TMIN RAIN 0 2010-01-01 6.7 5.8 -9.6 0.0 1 2011-01-01 7.9 3.3 -14.4 0.0 2 2012-01-01 9.9 5.0 -5.3 0.0 3 2013-01-01 6.6 -6.3 -15.8 0.0
期望输出
TIMESTAMP SR TEMP2MMAX TEMP2MMIN PRECIP 0 2010-01-01 6.7 5.8 -9.6 0.0 1 2010-01-02 9.45 3.45 -11.23 0.0 2 2010-01-03 1.52 -7.49 -10.96 0.0 3 2010-01-04 6.33 2.03 -7.72 0.0 4 2010-01-05 4.66 2.16 -5.07 0.0 .. ... ... ... ... ... 364 2013-01-01 6.6 -6.3 -15.8 0.00 365 2013-01-02 10.90 -6.33 -15.78 0.00 366 2013-01-03 10.93 0.20 -16.25 2.54 367 2013-01-04 11.19 -1.25 -15.91 0.51 368 2013-01-05 11.38 0.67 -19.19 0.00
错误尝试分析
尝试1:嵌套循环与错误索引
for year in range(2010, 2014): first_row = Dataframe_B[Dataframe_B['DATE']['TIMESTAMP'].dt.year == year].iloc[0] for year in range(2010, 2014): pd.concat([Dataframe_A[Dataframe_A['TIMESTAMP'].dt.year == year], first_row.to_frame()], , ignore_index=True)
问题点:
Dataframe_B['DATE']['TIMESTAMP']是错误的索引方式,B中没有TIMESTAMP列- 嵌套循环重复处理同一年份,逻辑混乱
first_row.to_frame()会将行转置为列,导致concat后数据结构错乱
尝试2:列名不匹配导致列冗余
for year in range(2010, 2014): second_df = Dataframe_A[Dataframe_A['DATE'].dt.year == year].copy() first_row_B = Dataframe_B[Dataframe_B['DATE'].dt.year == year].iloc[0] for year in range(2010, 2014): second_df = second_df[second_df['TIMESTAMP'] != pd.Timestamp(f'{year}-01-01')] second_df = pd.concat([first_row_B, second_df], axis=0, ignore_index=True).sort_values(by='TIMESTAMP').reset_index(drop=True)
问题点:
- A中没有
DATE列,应该用TIMESTAMP - B和A的列名不一致,concat后会生成重复列(如
DATE和TIMESTAMP) - 内层循环重复过滤所有年份的首日,逻辑错误
正确解决方案
步骤说明
- 统一两个DataFrame的列名,将B的列名映射为A的列名
- 确保日期列是
datetime类型(若尚未转换) - 将B的数据追加到A中
- 按日期排序并重置索引
代码实现
import pandas as pd # 1. 转换日期列为datetime类型(如果还不是的话) Dataframe_A['TIMESTAMP'] = pd.to_datetime(Dataframe_A['TIMESTAMP']) Dataframe_B['DATE'] = pd.to_datetime(Dataframe_B['DATE']) # 2. 重命名DataFrame B的列,与A对齐 Dataframe_B_renamed = Dataframe_B.rename(columns={ 'DATE': 'TIMESTAMP', 'SRAD': 'SR', 'TMAX': 'TEMP2MMAX', 'TMIN': 'TEMP2MMIN', 'RAIN': 'PRECIP' }) # 3. 合并两个DataFrame combined_df = pd.concat([Dataframe_A, Dataframe_B_renamed], ignore_index=True) # 4. 按TIMESTAMP排序,并重置索引 combined_df = combined_df.sort_values(by='TIMESTAMP').reset_index(drop=True)
验证结果
执行后,combined_df会包含所有年份的首日数据,且列结构与A完全一致,日期按顺序排列。
内容的提问来源于stack exchange,提问作者Kelechi Igwe
相关产品推荐
相关产品推荐

