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

如何用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)
  • 内层循环重复过滤所有年份的首日,逻辑错误

正确解决方案

步骤说明

  1. 统一两个DataFrame的列名,将B的列名映射为A的列名
  2. 确保日期列是datetime类型(若尚未转换)
  3. 将B的数据追加到A中
  4. 按日期排序并重置索引

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:45:55