Pyephem дает next_sunset не в тот день, если его вызывают после захода солнца - PullRequest
1 голос
/ 05 марта 2020

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

При публикации этого вопроса кажется, что проблема может быть в использовании localtime.

Вот код:

#import modules    
import datetime
import ephem

now = datetime.datetime(2020, 3, 4, 21, 00, 00) #set a relevant time after sunset today

wa = ephem.Observer() #create observer object

wa.lat = '47' #set observer parameters
wa.lon = '-122'
wa.date = now

s = ephem.Sun() #identify observed object (the sun)
s.compute(wa) #compute parameters

next_sunrise = ephem.localtime(wa.next_rising(s)) #return sunrise and sunset
next_sunset = ephem.localtime(wa.next_setting(s))

print('Its currently {}, next sunrise will be {}.'.format(now, next_sunrise))
print('Its currently {}, next sunset will be {}.'.format(now, next_sunset))

Дает:

Its currently 2020-03-04 21:00:00, next sunrise will be 2020-03-05 06:38:46.186438.
Its currently 2020-03-04 21:00:00, next sunset will be 2020-03-04 17:59:11.109622.
[Finished in 0.065s]

Это явно неверно: следующий закат наступит в 2020-03-05, если после захода солнца в 2020-03-04.

Примечательно, что это работает, если я не использую localtime (и использую Гринвич - чтобы упростить проверку результатов):

#import modules
import datetime
import ephem

now = datetime.datetime(2020, 3, 4, 21, 00, 00) #set a relevant time after sunset today

greenw = ephem.Observer() #create observer object

greenw.lat = '50' #set observer parameters
greenw.lon = '0'
greenw.date = now

s = ephem.Sun() #identify observed object (the sun)
s.compute(greenw) #compute parameters

next_sunrise = greenw.next_rising(s) #return sunrise and sunset
next_sunset = greenw.next_setting(s)

print('Its currently {}, next sunrise will be {}.'.format(now, next_sunrise))
print('Its currently {}, next sunset will be {}.'.format(now, next_sunset))

Дает

Its currently 2020-03-04 21:00:00, next sunrise will be 2020/3/5 06:33:54.
Its currently 2020-03-04 21:00:00, next sunset will be 2020/3/5 17:49:44.
[Finished in 0.07s]

Я не уверен, в чем здесь проблема. Я просмотрел документацию, но не могу разобраться. Возможно, есть проблема с localtime, или я упускаю что-то простое - извинения, я новичок как в python, так и в этом модуле.

1 Ответ

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

Я больше посмотрел на эту проблему и в итоге нашел обходной путь.

Кажется, что пифем был / отброшен в пользу Skyfield (https://rhodesmill.org/pyephem/). Я посмотрел на эту документацию для определения подъема, транзита и захода (https://rhodesmill.org/skyfield/almanac.html), но это казалось кувалдой для гвоздя. Далее, увидев, что я просто собираюсь запустить API, я просто решил, что смогу легче решить свою маленькую проблему с помощью API восхода-заката: https://sunrise-sunset.org/api

Код I хотел написать, смотрел на то, взошло ли солнце. Вот решение в python3 (извинения за небрежный код):

#import the relevant modules
import requests
from datetime import datetime, timedelta

#set lat and lng (use example of NYC):
lng = '-74'
lat = '40.7'

#call the api for today and tomorrow (times are UTC)
today = requests.get('https://api.sunrise-sunset.org/json?lat=' + lat + '&lng=' + lng + '&date=' + str(datetime.now().date()) + '&formatted=0')
tomorrow = requests.get('https://api.sunrise-sunset.org/json?lat=' + lat + '&lng=' + lng + '&date=' + str(datetime.now().date() + timedelta(days = 1)) + '&formatted=0')

#pull the results
unformatted_times = [i.json().get('results').get('sunset') for i in [today, tomorrow]]

#clean the results
cleaner_times = [i.replace('T', ' ') for i in unformatted_times]
cleaned_times = [i.replace('+00:00', '') for i in cleaner_times]

#create datetime objects out of results
date_time_class_times = [datetime.strptime(i, '%Y-%m-%d %H:%M:%S') for i in cleaned_times]

#create sunrise and sunset variables
sunset_today = date_time_class_times[0]
sunrise_tomorrow = date_time_class_times[1]

#write function to check if its dark, which takes a datetime object (times are in UTC)
def is_dark(now):
    if now > sunset_today and now < sunrise_tomorrow:
        return(True)
    else:
        return(False)

#call the function using utc time now
print(is_dark(datetime.utcnow()))

Дает:

False
[Finished in 1.026s]
...