使用pvlib绘制晴空模型与实测GHI对比图遇阻求助
问题排查与修正方案:PVLIB晴空模型与实测GHI对比绘图问题
一、核心问题梳理
- 实测GHI无法显示、当日>1000W/m²的极值被截断
- 调整数据格式后Ineichen/Solis晴空模型输出全为0.0
- 绘图时频繁报错、图形不符合预期
二、分步排查与解决
1. 实测数据预处理修正
时间与时区校验
pvlib要求时间序列带时区信息,且需与站点时区匹配(巴西利亚为America/Sao_Paulo,UTC-3),代码示例:
import pandas as pd # 读取数据时直接解析为带时区的时间索引 df = pd.read_csv('your_data.csv', index_col=0, parse_dates=True) df = df.tz_localize('America/Sao_Paulo', ambiguous='infer', nonexistent='shift_forward')
极值显示修正
检查绘图代码是否设置了y轴上限(如plt.ylim(0,1000)),若有则删除该限制,确保极值正常显示;同时确认数据中df['GHI'] > 1000的行未被误过滤。
2. 晴空模型输入参数校验
模型输出全为0.0的核心原因是输入参数错误:
- 确认站点参数正确:巴西利亚纬度
-15.7801、经度-47.9292、海拔1172m - 强制转换时间序列为UTC时区:pvlib晴空模型仅接受UTC时间输入,转换代码:
df_utc = df.tz_convert('UTC') - 检查Linke浊度值:Ineichen模型默认用McClear算法估算,若手动输入需确保数值在1-10区间内。
3. 标准模型调用与绘图代码
以下是可直接参考的完整代码,避免索引对齐、时区混合等问题:
import pvlib from pvlib.location import Location import matplotlib.pyplot as plt # 初始化巴西利亚站点 site = Location(latitude=-15.7801, longitude=-47.9292, altitude=1172, tz='America/Sao_Paulo') # 读取并预处理实测数据 df = pd.read_csv('brasilia_ghi_data.csv', index_col=0, parse_dates=True) df = df.tz_localize('America/Sao_Paulo', ambiguous='infer') df_utc = df.tz_convert('UTC') # 计算两种晴空模型的GHI ineichen_clear = site.get_clearsky(df_utc.index, model='ineichen') solis_clear = site.get_clearsky(df_utc.index, model='solis') # 转换回本地时区,确保与实测数据索引对齐 ineichen_clear = ineichen_clear.tz_convert('America/Sao_Paulo') solis_clear = solis_clear.tz_convert('America/Sao_Paulo') # 绘制对比图 plt.figure(figsize=(12,6)) plt.plot(df.index, df['GHI'], label='实测GHI', alpha=0.7) plt.plot(ineichen_clear.index, ineichen_clear['ghi'], label='Ineichen晴空GHI', linestyle='--') plt.plot(solis_clear.index, solis_clear['ghi'], label='Solis晴空GHI', linestyle=':') plt.ylabel('GHI (W/m²)') plt.xlabel('时间') plt.legend() plt.title('巴西利亚实测GHI与晴空模型对比') plt.show()
4. 常见报错排查
- 时区混合报错:确保所有时间序列均为带时区的
aware datetime,禁止naive datetime参与运算 - 数据对齐问题:若实测与模型时间索引不匹配,用
df = df.reindex(ineichen_clear.index, method='nearest')强制对齐
三、额外调试建议
- 打印模型输入输出的前5行,检查是否存在NaN或异常0值
- 取一个正午时间点,手动计算太阳高度角,对比模型输出是否符合物理逻辑
内容的提问来源于stack exchange,提问作者Matheus Teodosio
相关产品推荐
相关产品推荐

