Настройка часового пояса для вычисления солнечного положения - PullRequest
1 голос
/ 17 апреля 2020

Я получаю набор данных с данными UT C и координатами lat, долго я хочу вычислить солнечное положение для каждой строки этого набора дат, но у меня возникают проблемы с манипулированием часовым поясом.

До сих пор мне удавалось сделать данные UT C с учетом часового пояса:

# library for timezone computations
from timezonefinder import TimezoneFinder
from pytz import timezone
import pytz

# scientific python add-ons
import numpy as np
import pandas as pd   


tf = TimezoneFinder()
litteralTimeZone = tf.timezone_at(lng=longitude, lat=latitude)
print(litteralTimeZone)
tz = pytz.timezone(litteralTimeZone)
# Adjust date Time, currently in CSV like: 20070101:0000
Data['time(LOC)'] = pd.DatetimeIndex(
    pd.to_datetime(Data['time(UTC)'], format='%Y%m%d:%H%M')
).tz_localize(tz, ambiguous=True, nonexistent='shift_forward')
Data = Data.set_index('time(LOC)')

теперь, когда я передаю данные в функцию получения солнечного положения с помощью

pvlib.solarposition.get_solarposition(
    data.index, metadata['latitude'],metadata['longitude']) 

get_solarposition вычисляются на части данных UT C, игнорируя их локализованную часть.

Есть мысли?

1 Ответ

1 голос
/ 23 апреля 2020

Спасибо за использование pvlib !

Я считаю, что ваша проблема в том, что у вас есть временные метки UT C, но вы смешиваете их с местным часовым поясом. UT C является часовым поясом. Поэтому сначала вы должны локализовать наивные временные метки с помощью 'UTC'.

# make time-zone aware timestamps from string format in UTC
>>> Data['time(TZ-UTC)'] = pd.DatetimeIndex(
...     pd.to_datetime(Data['time(UTC)'], format='%Y%m%d:%H%M')).tz_localize('UTC')

Затем вы можете использовать их непосредственно в pvlib.solarposition.get_solarposition.

# mimic OP data
>>> Data = pd.DataFrame(
...     {'time(UTC)': ['20200420:2030', '20200420:2130', '20200420:2230']})
>>> Data
#        time(UTC)
# 0  20200420:2030
# 1  20200420:2130
# 2  20200420:2230

# apply the UTC timezone to the naive timestamps after parsing the string format
>>> Data['time(TZ-UTC)'] = pd.DatetimeIndex(
...     pd.to_datetime(Data['time(UTC)'], format='%Y%m%d:%H%M')).tz_localize('UTC')
>>> Data
#        time(UTC)              time(TZ-UTC)
# 0  20200420:2030 2020-04-20 20:30:00+00:00
# 1  20200420:2130 2020-04-20 21:30:00+00:00
# 2  20200420:2230 2020-04-20 22:30:00+00:00

# now call pvlib.solarposition.get_solarposition with the TZ-aware timestamps
>>> lat, lon = 39.74,-105.24
>>> solarposition.get_solarposition(Data['time(TZ-UTC)'], latitude=lat, longitude=lon)
#                            apparent_zenith     zenith  apparent_elevation  elevation     azimuth  equation_of_time
# time(TZ-UTC)
# 2020-04-20 20:30:00+00:00        34.242212  34.253671           55.757788  55.746329  221.860950          1.249402
# 2020-04-20 21:30:00+00:00        43.246151  43.261978           46.753849  46.738022  240.532481          1.257766
# 2020-04-20 22:30:00+00:00        53.872320  53.895328           36.127680  36.104672  254.103959          1.266117

Вам не нужно преобразовывать их в местный часовой пояс. При желании используйте pd.DatetimeIndex.tz_convert, чтобы преобразовать их из UT C в местный ( например : Golden, CO) часовой пояс. Примечание: может быть удобнее использовать фиксированное смещение, например Etc/GMT+7, поскольку переход на летнее время может привести к тому, что Pandas вызовет неоднозначную ошибку времени.

>>> Data['time(LOC)'] = pd.DatetimeIndex(Data['time(TZ-UTC)']).tz_convert('Etc/GMT+7')
>>> Data = Data.set_index('time(LOC)')
>>> Data
#                                time(UTC)              time(TZ-UTC)
# time(LOC)
# 2020-04-20 13:30:00-07:00  20200420:2030 2020-04-20 20:30:00+00:00
# 2020-04-20 14:30:00-07:00  20200420:2130 2020-04-20 21:30:00+00:00
# 2020-04-20 15:30:00-07:00  20200420:2230 2020-04-20 22:30:00+00:00

Результаты определения положения на Солнце должны быть точно такими же с местным ( например : золотой, СО) или UT C временем:

>>> solarposition.get_solarposition(Data.index, latitude=lat, longitude=lon)
#                            apparent_zenith     zenith  apparent_elevation  elevation     azimuth  equation_of_time
# time(LOC)
# 2020-04-20 13:30:00-07:00        34.242212  34.253671           55.757788  55.746329  221.860950          1.249402
# 2020-04-20 14:30:00-07:00        43.246151  43.261978           46.753849  46.738022  240.532481          1.257766
# 2020-04-20 15:30:00-07:00        53.872320  53.895328           36.127680  36.104672  254.103959          1.266117

Помогает ли это? Рад ответить на больше вопросов! Ура!

...