调用pvlib的get_total_irradiance时出现surface_tilt参数传参错误
问题分析与解决方案
错误根源
你触发TypeError是因为两个核心错误:
- 参数顺序完全颠倒:
pvlib.irradiance.get_total_irradiance的第一个参数要求是surface_tilt(表面倾角),但你把窗户表面积当成第一个参数传入,函数预期接收倾角数值,却拿到了表面积,类型匹配逻辑直接报错。 - 缺少必要辐照度分量:该函数需要至少直射辐照度(dni)、全局水平辐照度(ghi)、散射辐照度(dhi) 三个输入项,你只传了一个
irradiance366(推测是ghi),参数不完整也会引发类型/参数错误。
修正后的代码
假设new_df['irradiance366']是全局水平辐照度(ghi),如果没有dni和dhi数据,先用pvlib估算;如果已有实测值,直接替换对应列名即可:
import pvlib import pandas as pd location = pvlib.location.Location(45.384714, -71.911770, altitude=300, name=None) times = pd.date_range(start='2020-01-01', end='2020-12-31', freq='1h') angles = location.get_solarposition(times) new_df = new_df.truncate(before=angles.index[0], after=angles.index[-1]) # 窗户面积(单位:平方米) surface_sud = 10 surface_est = 5 surface_ouest = 5 # 从ghi估算dni和dhi(若有实测数据可直接替换) dni = pvlib.irradiance.dni_from_ghi(new_df['irradiance366'], angles['zenith']) dhi = new_df['irradiance366'] - dni * pd.cos(pvlib.tools.cosd(angles['zenith'])) # 计算南向垂直窗户的功率:先算POA辐照度(W/㎡),再乘以面积得功率(W) poa_sud = pvlib.irradiance.get_total_irradiance( surface_tilt=90, # 垂直窗户与水平面夹角为90度 surface_azimuth=180, solar_zenith=angles['zenith'], solar_azimuth=angles['azimuth'], dni=dni, ghi=new_df['irradiance366'], dhi=dhi )['poa_global'] puissance_sud = poa_sud * surface_sud # 东向垂直窗户 poa_est = pvlib.irradiance.get_total_irradiance( surface_tilt=90, surface_azimuth=90, solar_zenith=angles['zenith'], solar_azimuth=angles['azimuth'], dni=dni, ghi=new_df['irradiance366'], dhi=dhi )['poa_global'] puissance_est = poa_est * surface_est # 西向垂直窗户 poa_ouest = pvlib.irradiance.get_total_irradiance( surface_tilt=90, surface_azimuth=270, solar_zenith=angles['zenith'], solar_azimuth=angles['azimuth'], dni=dni, ghi=new_df['irradiance366'], dhi=dhi )['poa_global'] puissance_ouest = poa_ouest * surface_ouest puissance_totale = puissance_sud + puissance_est + puissance_ouest
补充说明
- 若你的
irradiance366不是ghi,需根据实际数据类型调整参数对应关系; - 若为斜窗,可修改
surface_tilt为对应角度(0=水平,90=垂直); - 使用实测dni、dhi数据的精度会高于估算值,优先用实测数据。
内容的提问来源于stack exchange,提问作者Jean Bon
相关产品推荐
相关产品推荐

