使用pvlib计算北半球垂直墙面POA辐照度:东墙值高于南墙异常
解决pvlib计算北半球垂直墙面辐照度异常(东墙>南墙、夏季南墙偏低)
核心问题排查与修复
1. 时区参数完全错误(最关键)
你的TMY数据时区设为US/Mountain(UTC-6,对应西经113°的时区),但Location类用了Etc/GMT+6(UTC+6,东六区),两者时区完全相反,导致太阳位置计算完全错位——相当于把白天当成黑夜,夏季的太阳位置被算成冬季的,直接造成南墙辐照度异常。
修复代码:
# 将location的时区改为和TMY一致的US/Mountain location = pvlib.location.Location(latitude=53.5501, longitude=-113.469, tz='US/Mountain')
2. 太阳位置计算的时间偏移逻辑优化
你当前的时间偏移(减30分钟再加回)容易导致索引对齐混乱。对于小时级TMY数据,辐照度代表该小时的平均值,正确做法是用小时中点时间计算太阳位置,直接生成中点时间即可:
# 生成小时中点时间(对应辐照度的平均时间) times = tmy.index + pd.Timedelta('30min') solar_position_ed = location.get_solarposition(times) # 将太阳位置的索引对齐回TMY的整点索引,确保和辐照度数据一一对应 solar_position_ed.index = tmy.index
3. 验证TMY数据合理性
先检查原始气象数据是否正常,比如绘制GHI的时间序列:
tmy['GHI'].plot(title='Hourly GHI')
如果夏季GHI没有明显高于冬季,说明TMY文件本身数据有误,需要重新获取或校验数据。
4. 更换更准确的辐照度模型
isotropic模型过于简化,垂直墙面的散射辐照度计算误差较大,建议换用haydavies或reindl模型:
df_poa_ed = pvlib.irradiance.get_total_irradiance( surface_tilt=90, surface_azimuth=180, dni=tmy['DNI'], ghi=tmy['GHI'], dhi=tmy['DHI'], solar_zenith=solar_position_ed['apparent_zenith'], solar_azimuth=solar_position_ed['azimuth'], model='haydavies' )
修正后的完整代码
import pandas as pd import pvlib import matplotlib.pyplot as plt # 读取TMY数据并设置时区 tmy = pd.read_csv('Weatherfile_0.5_Ed.csv', nrows=8760, usecols=["DHI","DNI","GHI"]) tmy.index = pd.date_range(start="2023-01-01 00:00", end="2023-12-31 23:00", freq='h', tz="US/Mountain") # 初始化位置(时区与TMY一致) location = pvlib.location.Location(latitude=53.5501, longitude=-113.469, tz='US/Mountain') # 计算小时中点的太阳位置 times = tmy.index + pd.Timedelta('30min') solar_position_ed = location.get_solarposition(times) solar_position_ed.index = tmy.index # 计算南墙总辐照度(表面倾角90°,方位角180°) df_poa_south = pvlib.irradiance.get_total_irradiance( surface_tilt=90, surface_azimuth=180, dni=tmy['DNI'], ghi=tmy['GHI'], dhi=tmy['DHI'], solar_zenith=solar_position_ed['apparent_zenith'], solar_azimuth=solar_position_ed['azimuth'], model='haydavies' ) # 计算东墙总辐照度(方位角90°) df_poa_east = pvlib.irradiance.get_total_irradiance( surface_tilt=90, surface_azimuth=90, dni=tmy['DNI'], ghi=tmy['GHI'], dhi=tmy['DHI'], solar_zenith=solar_position_ed['apparent_zenith'], solar_azimuth=solar_position_ed['azimuth'], model='haydavies' ) # 对比绘制南墙和东墙的总辐照度 pd.concat([df_poa_south['poa_global'], df_poa_east['poa_global']], axis=1, keys=['South Wall', 'East Wall']).plot(title='Hourly POA Global Irradiance') plt.show() # 打印年总辐照度验证 print(f"南墙年总辐照度: {df_poa_south['poa_global'].sum():.2f} Wh/m²") print(f"东墙年总辐照度: {df_poa_east['poa_global'].sum():.2f} Wh/m²")
验证标准
修复后,北半球53°纬度的南墙年总辐照度应明显高于东墙,夏季(6-8月)南墙的小时辐照度应出现日间峰值,符合实际日照规律。
内容的提问来源于stack exchange,提问作者Aynkaran Aymmugan
相关产品推荐
相关产品推荐

