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

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

额外验证步骤

  1. 检查df_inputs是否存在NaN:
print(df_inputs.isna().sum())

若仍有NaN,说明CSV气象数据本身存在缺失,需补全或过滤。

  1. 确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:54:18