Получить фазу дня на основе солнечной высоты / азимута - PullRequest
0 голосов
/ 15 марта 2020

В соответствии с документацией к полевому небу онлайн, я могу рассчитать, является ли данное время дня днем ​​ или ночью .

import skyfield.api
import skyfield.almanac

ts = skyfield.api.load.timescale()
ephemeris = skyfield.api.load('de421.bsp')

observer = skyfield.api.Topos(latitude_degrees=LAT, longitude_degrees=LON)

is_day_or_night = skyfield.almanac.sunrise_sunset(ephemeris, observer)

day_or_night = is_day_or_night(ts.utc(merged_df.index.to_pydatetime()))

s = pd.Series(data=['Day' if is_day else 'Night' for is_day in day_or_night],
              index = merged_df.index, dtype='category')

merged_df['Day or Night'] = s

Теперь я хочу также классифицировать утренние / полуденные / вечерние фазы дня по солнечной высоте / азимуту. Я пришел к следующему:

earth, sun = ephemeris['earth'], ephemeris['sun']

observer = earth + skyfield.api.Topos(latitude_degrees=LAT,
                                      longitude_degrees=LON)
astrometric = observer.at(ts.utc(merged_df.index.to_pydatetime())).observe(sun)
alt, az, d = astrometric.apparent().altaz()

Мне нужна помощь в понимании того, как действовать дальше, поскольку у меня нет соответствующих базовых знаний об астрономических вычислениях. Спасибо

1 Ответ

0 голосов
/ 17 марта 2020

Согласно Комментарий Брэндона , я использовал косинус зенитного угла, чтобы получить интенсивность солнечного света, а затем взломал интенсивность солнечного света с зенитным углом, чтобы сформировать монотонно увеличивающийся функция для продолжительности дня.

temp = pd.DataFrame({'zenith': 90 - alt.degrees,
                     'Day or Night': day_or_night},
                    index=merged_df.index)

temp['cos zenith'] = np.cos(np.deg2rad(temp['zenith']))

temp['feature'] = temp['cos zenith'].diff(periods=-1)*temp['zenith']

temp['Day Phase'] = None

temp.loc[temp['Day or Night'] == False, 'Day Phase'] = 'Night'
temp.loc[(temp['feature'] > -np.inf) & (temp['feature'] <= -0.035), 'Day Phase'] = 'Morning'
temp.loc[(temp['feature'] > -0.035) & (temp['feature'] <= 0.035), 'Day Phase'] = 'Noon'
temp.loc[(temp['feature'] > 0.035) & (temp['feature'] <= np.inf), 'Day Phase'] = 'Evening'

merged_df['Phase of Day'] = temp['Day Phase']

Пределы могут быть скорректированы для изменения продолжительности, требуемой для полудня, et c.

...