基于日期从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前几行数据:
| Temperature | Date |
|---|---|
| 272.3417167622245 | 2021-01-01 00:00 |
| 272.1774031773405 | 2021-01-01 01:00 |
| 271.71183130162035 | 2021-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
相关产品推荐
相关产品推荐

