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