使用 pvlib 将时间数据转换为时角
Converting time data into hour angle using pvlib
我有以下格式的太阳能数据:
我想使用 pvlib 包将时间索引转换为时角。到目前为止,我的代码使用 pandas 从 .csv 文件中读取输入数据并提取时间数据。我需要将此数据(以 30 分钟为间隔)转换为小时角,但我不断收到错误消息:
TypeError: index is not a valid DatetimeIndex or PeriodIndex
到目前为止,这是我的代码:
# Import modules
import pandas as pd
import pvlib
# Read in data from .csv file for time and DHI
headers = ["Time","DHI"]
data_file = pd.read_csv("path to csv file",names=headers)
time_data = data_file["Time"]
# Find equation of time for hour angle calc
equation_of_time = pvlib.solarposition.equation_of_time_spencer71(1)
# Find hour angle
hour_angle = pvlib.solarposition.hour_angle(time_data, -89.401230, equation_of_time)
如错误消息所述,问题在于您的索引不是 DateTimeIndex。要计算小时角,我们需要知道具体时间,因此需要 DateTimeIndex。现在你只是传递一个整数列表,这对函数没有任何意义。
让我们先来创建一个小例子:
import pandas as pd
import pvlib
df = pd.DataFrame(data={'time': [0,570,720], 'DHI': [0,50,100]})
df.head()
time DHI
0 0 0
1 570 50
2 720 100
# Create a DateTimeIndex:
start_date = pd.Timestamp(2020,7,28).tz_localize('Europe/Copenhagen')
df.index = start_date + pd.to_timedelta(df['time'], unit='min')
现在 DataFrame 看起来像这样:
time DHI
time
2020-07-28 00:00:00+02:00 0 0
2020-07-28 09:30:00+02:00 570 50
2020-07-28 12:00:00+02:00 720 100
现在我们可以将索引传递给时角函数,因为它代表独特的时间段:
equation_of_time = pvlib.solarposition.equation_of_time_spencer71(df.index.dayofyear)
# Find hour angle
hour_angle = pvlib.solarposition.hour_angle(df.index, -89.401230,
equation_of_time)
注意开始日期是如何本地化到特定时区的。这是必要的,除非您的数据是 UTC,否则索引不代表唯一时间段。
@Adam_Jensen的回答很好,但不是最简单的。如果您查看 hour_angle
函数的代码,您会发现其中 2/3 用于将这些时间戳转回整数。剩下的很简单,你不需要 pvlib。
# hour_angle and equation_of_time are defined in the question
LONGITUDE = -89.401230
LOCAL_MERIDIAN = -90
hour_angle = (LONGITUDE - LOCAL_MERIDIAN) + (time_data - 720 + equation_of_time) / 4
了解幕后发生的事情总是好的!
我有以下格式的太阳能数据:
我想使用 pvlib 包将时间索引转换为时角。到目前为止,我的代码使用 pandas 从 .csv 文件中读取输入数据并提取时间数据。我需要将此数据(以 30 分钟为间隔)转换为小时角,但我不断收到错误消息:
TypeError: index is not a valid DatetimeIndex or PeriodIndex
到目前为止,这是我的代码:
# Import modules
import pandas as pd
import pvlib
# Read in data from .csv file for time and DHI
headers = ["Time","DHI"]
data_file = pd.read_csv("path to csv file",names=headers)
time_data = data_file["Time"]
# Find equation of time for hour angle calc
equation_of_time = pvlib.solarposition.equation_of_time_spencer71(1)
# Find hour angle
hour_angle = pvlib.solarposition.hour_angle(time_data, -89.401230, equation_of_time)
如错误消息所述,问题在于您的索引不是 DateTimeIndex。要计算小时角,我们需要知道具体时间,因此需要 DateTimeIndex。现在你只是传递一个整数列表,这对函数没有任何意义。
让我们先来创建一个小例子:
import pandas as pd
import pvlib
df = pd.DataFrame(data={'time': [0,570,720], 'DHI': [0,50,100]})
df.head()
time DHI
0 0 0
1 570 50
2 720 100
# Create a DateTimeIndex:
start_date = pd.Timestamp(2020,7,28).tz_localize('Europe/Copenhagen')
df.index = start_date + pd.to_timedelta(df['time'], unit='min')
现在 DataFrame 看起来像这样:
time DHI
time
2020-07-28 00:00:00+02:00 0 0
2020-07-28 09:30:00+02:00 570 50
2020-07-28 12:00:00+02:00 720 100
现在我们可以将索引传递给时角函数,因为它代表独特的时间段:
equation_of_time = pvlib.solarposition.equation_of_time_spencer71(df.index.dayofyear)
# Find hour angle
hour_angle = pvlib.solarposition.hour_angle(df.index, -89.401230,
equation_of_time)
注意开始日期是如何本地化到特定时区的。这是必要的,除非您的数据是 UTC,否则索引不代表唯一时间段。
@Adam_Jensen的回答很好,但不是最简单的。如果您查看 hour_angle
函数的代码,您会发现其中 2/3 用于将这些时间戳转回整数。剩下的很简单,你不需要 pvlib。
# hour_angle and equation_of_time are defined in the question
LONGITUDE = -89.401230
LOCAL_MERIDIAN = -90
hour_angle = (LONGITUDE - LOCAL_MERIDIAN) + (time_data - 720 + equation_of_time) / 4
了解幕后发生的事情总是好的!