PVLIB: проблемы с вычислением часового угла с использованием PVLIB - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь вычислить часовой угол для использования функции PVLIB " pvl.solarposition.hour_angle () ".

Код, который я разрабатываю, структурирован в 02части:

  • Сначала я преобразовываю время GPS (секунды недели) в UTC. Время форматируется в '% Y-% m-% d% H:% M:% S' .Полученный результат приведен в формате времени UTC, поскольку время в формате GPS указано в формате UTC.
  • Во второй части я пытаюсь рассчитать часовой угол, используя PVLIB, и в этой части возникают проблемы.

Когда я запускаю часовой угол, питон возвращает сообщение об ошибке:

"naive_times = times.tz_localize (None) # наивный, но все еще локализованный AttributeError: объект 'str'не имеет атрибута 'tz_localize ".

Я знаю, что эта ошибка связана с классом для переменной" final_time "в реализованном коде.Согласно документации PVLIB, эта переменная должна оставаться в классе pandas.DatetimeIndex (https://pvlib -python.readthedocs.io / en / latest / generate / pvlib.solarposition.hour_angle.html ) и я не знаю, как правильно преобразовать время GPS в этот класс, а затем использовать этот результат в PVLIB для вычисления часового угла.

Ниже приведена часть алгоритма, который я использую здесь в тестах:


import datetime
import pvlib as pvl


t_gps = 138088.886582 #seconds of week

lat = -23.048576 # degress
long = -46.305043 # degrees


## Transfomring the GPS time (seconds of week) in Date Time

## The result printed here is in UTC time because the GPS time is refered in UTC Time.

datetimeformat = ('%Y-%m-%d %H:%M:%S')
leapsecond = 37
epoch = datetime.datetime.strptime ( "1980-01-06 00:00:00" , datetimeformat)
decorrido = datetime.timedelta( days = (2024 * 7 ), seconds = t_gps + leapsecond)
final_time = datetime.datetime.strftime(epoch + decorrido, datetimeformat)
print(final_time)
print(type(final_time))

## Calculating the hour angle using PVLIB

solar_declin = pvl.solarposition.declination_spencer71(295)
print(solar_declin)

eq_time = pvl.solarposition.equation_of_time_pvcdrom(295)
print(eq_time)

hour_angle = pvl.solarposition.hour_angle(final_time, long, eq_time)
print(hour_angle)

В связи с этой проблемой у меня следующие вопросы:

  1. Как преобразовать время GPS (секунды недели) в формат '% Y-% m-% d% H:% M:% S ' и для класса pandas.DatetimeIndex ?

  2. Как результат после преобразования времени GPS в UTC, мне нужно сначала преобразовать в местное время и снова преобразовать для времени UTC, включая tz_localize?

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Вместо использования datetime или строк для заполнения DatetimeIndex, создайте pandas.Timestamp версию pandas datetime.datetime.

Сначала создайте метку времени Posix, то есть секунды с начала эпохи:

week_number = 2024
t_gps = 138088.886582
leapsecond = 37
posix_ts = week_number * 7 * 24 * 60 * 60 + t_gps + leapsecond

Затем создайте Timestamp:

pandas_ts = Timestamp.utcfromtimestamp(posix_ts)
>>> Timestamp('2008-10-17 14:22:05.886582')

На этом этапе Timestamp является «наивным»: при сборке в формате UTC он не содержит информацию о часовом поясе., так:

pandas_ts = pandas_ts.tz_localize("UTC")
>>> Timestamp('2008-10-17 14:22:05.886582+0000', tz='UTC')

Наконец, вы можете преобразовать в ваш местный часовой пояс:

pandas_ts = pandas_ts.tz_convert("my_time_zone")  # replace by correct tz
>>> Timestamp('2008-10-17 NN:22:05.886582+XXXX', tz='my_time_zone')

и построить необходимый DatetimeIndex:

di = DatetimeIndex([pandas_ts])
print(di)  # shows the time zone in the type (dtype='datetime64[ns, my_time_zone]')

long = -46.305043
eq_time = pvl.solarposition.equation_of_time_pvcdrom(295)
hour_angle = pvl.solarposition.hour_angle(di, long, eq_time)
print(hour_angle)

ДонНе смешивайте tz_localize и tz_convert и не забывайте всегда устанавливать часовой пояс.Таким образом, вы управляете созданием DatetimeIndex, используя строку, на которую вы полагаетесь при автоматическом разборе pandas, проблематично с часовым поясом.

0 голосов
/ 11 июля 2019

В моем подходе я использую astropy библиотеку для преобразования времени GPS в формат даты и времени. Затем преобразуйте это время в Datetimeindex с пандами;

= ^ .. ^ =

import pandas as pd
import pvlib as pvl
from astropy.time import Time

latitude = -23.048576 # degress
longitude = -46.305043 # degrees

# convert gps seconds to time format
gps_time = 138088.886582
t = Time(gps_time, format='gps')
t = Time(t, format='iso')

# create empty df
df = pd.DataFrame(columns = ['Timestamp'])

# create date time series
time_series = pd.to_datetime(str(t), infer_datetime_format=True)

# append time series to data frame
df = df.append({'Timestamp': pd.to_datetime(time_series)}, ignore_index=True)
df = df.append({'Timestamp': pd.to_datetime(time_series)}, ignore_index=True)

# create time index
time_index = pd.DatetimeIndex(df.Timestamp)

# calculate hour angle
hour_angle = pvl.solarposition.hour_angle(time_index, longitude, latitude*60)

Выход:

[-356.58415383 -356.58415383]
...