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

基于日期从CSV提取温度数据失败问题排查(AOD研究)

解决Pandas无法匹配日期提取温度数据的问题

我正在研究气溶胶光学厚度(AOD)随温度的变异性,需要从Temp_Data.csv中提取Plot_Dates.csv指定日期对应的温度数据,用于和同期AOD数据对比。但现有代码无法匹配日期,核心错误行Temp = TEMP.loc[Date, 'Temperature'],最终Plot_Temp输出长度为0。

原代码:

import csv
import pandas as pd
import datetime

DATES = pd.read_csv("Plot_Dates.csv")
TEMP = pd.read_csv("Temp_Data.csv")
AOD = pd.read_csv("AOD_Data.csv")

AOD['Date'] = pd.to_datetime(AOD['Date'])
TEMP['Date'] = pd.to_datetime(TEMP['Date'])

DATES['TEMP_Date'] = pd.to_datetime(DATES['TEMP_Date'])
DATES['AOD_Date'] = pd.to_datetime(DATES['AOD_Date'])

Plot_Temp = []

for Date in DATES['TEMP_Date']:
    for TempDate in TEMP['Date']:
        if TempDate == Date:
                Temp = TEMP.loc[Date, 'Temperature']
                print(Temp)
                Plot_Temp.append(Temp)


print(len(Plot_Temp)) 
# 用于验证,当前输出为0

Temp_Data.csv前几行数据:

TemperatureDate
272.34171676222452021-01-01 00:00
272.17740317734052021-01-01 01:00
271.711831301620352021-01-01 02:00

预期得到温度列表:[272.3417167622245, 272.1774031773405, 271.71183130162035]


错误原因

  • loc用法错误:TEMP.loc[Date, 'Temperature']尝试用Date(datetime对象)作为行标签索引,但TEMP的行索引是默认的整数序列(0、1、2...),并非日期值,因此无法匹配到任何数据。
  • 双重循环效率低下:遍历两个DataFrame的日期列是冗余操作,完全可以用Pandas的矢量化操作替代。

解决方案

方案1:用isin快速筛选(推荐)

直接利用isin方法筛选出TEMP中日期在指定列表内的行,再提取温度列转为列表:

import pandas as pd

# 读取并转换日期格式
DATES = pd.read_csv("Plot_Dates.csv")
TEMP = pd.read_csv("Temp_Data.csv")
AOD = pd.read_csv("AOD_Data.csv")

AOD['Date'] = pd.to_datetime(AOD['Date'])
TEMP['Date'] = pd.to_datetime(TEMP['Date'])
DATES['TEMP_Date'] = pd.to_datetime(DATES['TEMP_Date'])
DATES['AOD_Date'] = pd.to_datetime(DATES['AOD_Date'])

# 提取匹配日期的温度数据
Plot_Temp = TEMP[TEMP['Date'].isin(DATES['TEMP_Date'])]['Temperature'].tolist()

# 验证结果
print(Plot_Temp)
print(len(Plot_Temp))

方案2:用merge合并数据(适合后续多表对比)

通过合并操作将指定日期表和温度表关联,方便处理缺失值和后续与AOD数据的对比:

import pandas as pd

# 读取并转换日期格式
DATES = pd.read_csv("Plot_Dates.csv")
TEMP = pd.read_csv("Temp_Data.csv")
AOD = pd.read_csv("AOD_Data.csv")

AOD['Date'] = pd.to_datetime(AOD['Date'])
TEMP['Date'] = pd.to_datetime(TEMP['Date'])
DATES['TEMP_Date'] = pd.to_datetime(DATES['TEMP_Date'])
DATES['AOD_Date'] = pd.to_datetime(DATES['AOD_Date'])

# 按日期合并,保留所有指定日期,缺失温度值显示NaN
temp_matched = pd.merge(
    DATES[['TEMP_Date']], 
    TEMP, 
    left_on='TEMP_Date', 
    right_on='Date', 
    how='left'
)

# 提取温度列表(去除缺失值)
Plot_Temp = temp_matched['Temperature'].dropna().tolist()

print(Plot_Temp)
print(len(Plot_Temp))

方案3:修正原循环逻辑(不推荐,仅作参考)

如果要保留循环结构,需改用布尔索引找到匹配行:

import pandas as pd

DATES = pd.read_csv("Plot_Dates.csv")
TEMP = pd.read_csv("Temp_Data.csv")
AOD = pd.read_csv("AOD_Data.csv")

AOD['Date'] = pd.to_datetime(AOD['Date'])
TEMP['Date'] = pd.to_datetime(TEMP['Date'])
DATES['TEMP_Date'] = pd.to_datetime(DATES['TEMP_Date'])
DATES['AOD_Date'] = pd.to_datetime(DATES['AOD_Date'])

Plot_Temp = []

for Date in DATES['TEMP_Date']:
    # 用布尔索引筛选匹配日期的行
    matched_row = TEMP[TEMP['Date'] == Date]
    if not matched_row.empty:
        # 提取温度值(取第一行,假设日期唯一)
        Temp = matched_row['Temperature'].iloc[0]
        Plot_Temp.append(Temp)

print(Plot_Temp)
print(len(Plot_Temp))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:31:31