PVLIB: Проблемы расчета часового угла с использованием PVLIB

Я пытаюсь рассчитать часовой угол для использования функции 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/generated/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?

    1. Как результат после преобразования времени GPS находится во времени UTC, мне нужно сначала преобразовать в местное время и снова преобразовать во время UTC, включая tz_localize?
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
384
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

=^..^=

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]

Зараки Кенпачи, спасибо за помощь в решении. Это решило мою проблему, и теперь можно рассчитать часовой угол, но есть небольшая проблема с датой, рассчитанной, когда код преобразует секунды GPS в формат времени. Правильная дата — 22.10.2018, а напечатанное значение — 07.01.1980. Есть ли у вас какие-либо идеи для преобразования в правильную дату (2018-10-22)?

César de Paula 11.07.2019 16:44

@CésardePaula, данные рассчитываются правильно. Согласно docs.astropy.org/en/stable/api/… GPS в секундах добавляется к дате 1980-01-06 00:00:00 UTC,

Zaraki Kenpachi 12.07.2019 08:03

Вместо того, чтобы использовать 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, что проблематично с часовым поясом.

gaFF, спасибо за помощь. Теперь я понял о проблеме, и решение, которое вы предложили здесь, решило проблему, и теперь можно рассчитать часовой угол. Как я уже отмечал выше, в вашем предложении есть проблема с датой. Правильная дата — 22.10.2018, а в предложенном вами решении печатается дата 20.02.2009. Есть ли у вас какие-либо идеи, чтобы получить правильную дату?

César de Paula 11.07.2019 16:51

Проблема возникает из-за неправильного номера недели. У нас нет подробностей в вашем образце кода, чтобы помочь вам, но вы должны найти надежный способ перевести индикацию недели в число дней из эпохи. Я взял 2024 * 7 из вашего кода.

gaFF 11.07.2019 16:58

Хорошо.... Я использовал этот веб-сайт для расчета номера недели labsat.co.uk/index.php/en/gps-time-calculator и вижу, что это неверно. Вы предлагаете другой способ определить правильный номер недели?

César de Paula 11.07.2019 17:15

Какова ваша исходная информация? Номер недели не является целью, целью является количество дней с 1 января 1970 года.

gaFF 17.07.2019 12:12

Другие вопросы по теме