Python计算日照总辐射量

import numpy as np
from datetime import datetime
import pandas as pd


def get_dayofyear(date_string):
    '''
    :param date_string: 字符串时间格式
    :return: 某日期属于一年中的第几天
    '''
    # date_string = '20230131'
    # 将字符串转换为datetime对象
    date = datetime.strptime(date_string, '%Y%m%d')
    # 使用day属性得到这一天是该年的第几天
    day_of_year = date.timetuple().tm_yday
    return day_of_year


def get_ra(lat, yyyymmdd):
    '''
    :param lat: 所在地维度
    :param yyyymmdd: 所在时间,yyyymmdd格式
    :return: ra:大气外太阳辐射;24 / np.pi * theta_sun:理论日照时长
    '''
    J = get_dayofyear(yyyymmdd)
    phi = lat / 180 * np.pi
    epsilon_sun = 0.409 * np.sin(2 * np.pi / 365 * J - 1.39)
    dr = 1 + 0.33 * np.cos(2 * np.pi / 365 * J)
    theta_sun = np.arccos(-np.tan(phi) * np.tan(epsilon_sun))
    ra = 0.0820 * 24 * 60 / np.pi * dr * (
            theta_sun * np.sin(phi) * np.sin(epsilon_sun) + np.cos(phi) * np.cos(epsilon_sun) * np.sin(theta_sun))
    return ra, 24 / np.pi * theta_sun


if __name__ == '__main__':
    df_sun = pd.read_csv('日照时数.csv', na_values=9999)  # 读取数据
    sun_hour = np.array(df_sun.iloc[6212:21918, :])  # 选出1978-2020年日照数据
    solar_radiation = np.full_like(sun_hour, np.nan)
    for i in range(np.size(sun_hour, 0)):
        for j in range(1, np.size(sun_hour, 1)):
            ra, N = get_ra(df_sun.iloc[2, j], str(int(sun_hour[i, 0])))
            solar_radiation[i, j] = (0.16 + 0.58 * sun_hour[i, j] / N) * ra
    solar_radiation[:, 0] = sun_hour[:, 0]
    np.save('solar_radiation.npy', solar_radiation)

参考文献:

  1. 杨勤.宁夏区域太阳日辐射通量计算方法的研究[J].干旱气象,2007(03):23-27.
  2. 杨勤,梁旭,赵光平等.宁夏太阳辐射逐日、月、年总量的变化特征[J].干旱区研究,2009,26(03):413-423.DOI:10.13866/j.azr.2009.03.008.

你可能感兴趣的:(python,开发语言)