使用pvfactors计算双面光伏辐照时输出DataFrame全为NaN值求助
解决pvfactors计算双面光伏背面辐照全NaN问题
问题根源分析
你的代码存在几个关键错误,直接导致背面辐照计算结果全为NaN:
- 时间索引不匹配:手动生成的
df_inputs索引与CSV读取的meteo数据索引未对齐,若两者行数不一致,会使气象参数列出现NaN,后续计算直接失效。 - 太阳天顶角计算错误:天顶角正确公式为
π/2 - 太阳高度角(弧度),你写反了逻辑,且未处理角度转弧度的问题,导致np.cos(solar_zenith)出现负数或零值,进而让dni计算异常。 - 未处理夜间DNI异常:夜间太阳高度角为负,天顶角大于90度,此时
np.cos(solar_zenith)为负,计算出的dni为负数,pvfactors无法处理这类异常值,直接返回NaN。 - 系统参数冲突:
meteo中设置axis_azimuth=180,但pvarray_parameters里设为0.,参数不一致导致系统朝向逻辑混乱。
修复后的代码
# Import external libraries from datetime import datetime import pandas as pd import numpy as np # 读取气象数据并解析时间索引(确保CSV第一列为时间格式) meteo = pd.read_csv('test_BifacialSystem.csv', skiprows=1, header=None, delimiter=';', index_col=0, parse_dates=True) meteo.columns = ['GHI', 'DHI', 'jour','h1','Time','HSol','AzSol'] # 1. 修正太阳天顶角计算:先将HSol(角度)转弧度,再计算天顶角 meteo['solar_zenith'] = np.pi/2 - np.radians(meteo['HSol']) # 处理夜间天顶角大于90度的情况,避免cos值为负 meteo.loc[meteo['solar_zenith'] > np.pi/2, 'solar_zenith'] = np.pi # 2. 正确计算DNI并处理异常值 meteo['dni'] = (meteo['GHI'] - meteo['DHI']) / np.cos(meteo['solar_zenith']) # 夜间或DNI为负时强制设为0 meteo.loc[(meteo['GHI'] == 0) | (meteo['dni'] < 0), 'dni'] = 0 # 3. 统一系统参数,避免冲突 meteo['solar_azimuth'] = meteo['AzSol'] # 使用CSV中的太阳方位角,而非固定0 meteo['surface_azimuth'] = 180 meteo['surface_tilt'] = 20 meteo['axis_azimuth'] = 180 meteo['gcr'] = 65.1 / 81 meteo['pvrow_height'] = 2.1 meteo['pvrow_width'] = 6 meteo['n_pvrows'] = 3 meteo['index_observed_pvrow'] = 1 meteo['rho_front_pvrow'] = 0.03 meteo['rho_back_pvrow'] = 0.05 meteo['horizon_band_angle'] = 15 meteo['albedo'] = 0.4 # 4. 使用meteo原始时间索引创建df_inputs,确保数据对齐 df_inputs = pd.DataFrame( {'solar_zenith': meteo['solar_zenith'], 'solar_azimuth': meteo['solar_azimuth'], 'surface_tilt': meteo['surface_tilt'], 'surface_azimuth': meteo['surface_azimuth'], 'dni': meteo['dni'], 'dhi': meteo['DHI'], 'albedo': meteo['albedo']}, index=meteo.index) # 统一pvarray参数,与meteo设置保持一致 pvarray_parameters = { 'n_pvrows': 3, 'pvrow_height': 2.1, 'pvrow_width': 6, 'axis_azimuth': 180., 'gcr': 65.1 / 81, }
额外验证步骤
- 检查
df_inputs是否存在NaN:
print(df_inputs.isna().sum())
若仍有NaN,说明CSV气象数据本身存在缺失,需补全或过滤。
- 确认pvfactors计算逻辑正确:
from pvfactors.run import run_timeseries_engine # 执行计算并查看结果 df_report = run_timeseries_engine(df_inputs, pvarray_parameters) print(df_report[['total_incident_back', 'total_absorbed_back']].dropna())
内容的提问来源于stack exchange,提问作者worky
相关产品推荐
相关产品推荐

