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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:40:57