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

基于日期与站点ID合并Excel表并跳过NaN值的Python实现问题

问题描述
  • 现有两个数据文件:
    • 因变量Excel文件:以Date为DataFrame索引,Station ID为表头,存储各站点对应日期的监测值
    • 自变量CSV文件:日期拆分为年、月、日三列,需匹配对应站点和日期的因变量值
  • 核心需求:
    1. 跳过因变量表中的NaN值
    2. 基于相同日期+Station ID,将因变量值匹配添加到自变量表中
问题分析

你当前代码中手动嵌套循环处理NaN、转numpy数组的方式,会丢失DataFrame的索引和列信息,反而增加匹配难度。Pandas内置了高效的数据清洗与合并工具,完全可以替代手动循环完成需求。

解决方案步骤

1. 读取并预处理数据集

  • 读取因变量Excel时,保留Date作为索引,表头的Station ID作为列
  • 读取自变量CSV时,将年、月、日三列合并为标准日期格式列,保证与因变量表的日期格式统一

2. 重塑因变量数据格式

因变量表是宽格式(Station ID为列),需转成长格式(每行对应一个日期+站点的有效组合),此操作会自动过滤NaN值,同时让数据结构与自变量表对齐。

3. 合并两个数据集

使用Pandas的merge函数,基于日期和Station ID两个字段精准匹配,将因变量值添加到自变量表中。

完整代码
import pandas as pd
import numpy as np

# ---------------------- 1. 读取数据 ----------------------
# 读取因变量Excel:Date为索引,Station ID为表头
path = 'F:/72hourtimewindow/project/waterqualitydate/29UMT/'
df_dep = pd.read_excel(path+'Stationwithorder.xls', header=0, index_col=0)

# 读取自变量CSV:合并年、月、日为日期列
df_indep = pd.read_csv('GEEdownload.csv')
# 注意:如果自变量表的年/月/日列名不是'year'/'month'/'day',请替换为实际列名
df_indep['Date'] = pd.to_datetime(df_indep[['year', 'month', 'day']])

# ---------------------- 2. 重塑因变量数据并过滤NaN ----------------------
# 宽格式转长格式,自动丢弃NaN值
df_dep_long = df_dep.stack().reset_index()
# 重命名列名,方便后续合并
df_dep_long.columns = ['Date', 'Station ID', '因变量值']

# ---------------------- 3. 合并两个数据集 ----------------------
# 基于Date和Station ID匹配,保留自变量表所有行,匹配到的填充因变量值
final_df = pd.merge(df_indep, df_dep_long, on=['Date', 'Station ID'], how='left')

# 查看结果
print(final_df.head())
# 保存匹配后的数据集
final_df.to_csv('匹配后的数据集.csv', index=False)
关键代码说明
  • df_dep.stack():将宽格式的因变量表转成长格式,自动跳过所有NaN值,只保留有效数据
  • pd.to_datetime(df_indep[['year', 'month', 'day']]):将拆分的日期列合并为标准日期格式,确保与因变量表的日期能精准匹配
  • pd.merge(..., how='left'):保留自变量表的所有行,匹配成功的行填充因变量值,未匹配到的显示NaN;若只需保留匹配成功的行,可将how='left'改为how='inner'

内容的提问来源于stack exchange,提问作者Minyan Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:45:27