我目前正在开展一个项目,该项目会在触发与灯光相关的某些活动时通知用户。我做过与光有关的部分。因此,我需要找到一种有效的方法来检索python中的日出和日落时间,因为整个脚本是用python编写的。我知道有几个库用于其他语言,我想知道在python中最方便的方法是做什么。
我想这看起来很像这样:
if(sunrise<T<sunset) and (light<threshold):
notifyUser()
我很感激这里的任何帮助,有一个好的。
答案 0 :(得分:10)
结帐astral。这是一个略微修改过的example from their docs:
>>> from astral import Astral
>>> city_name = 'London'
>>> a = Astral()
>>> a.solar_depression = 'civil'
>>> city = a[city_name]
>>> sun = city.sun(date=datetime.date(2009, 4, 22), local=True)
>>> if (sun['sunrise'] < T < sun['sunset']) and (light < threshold):
>>> notifyUser()
如果您使用此示例之类的内容,请务必更改提供给city_name
的{{1}}和日期。
答案 1 :(得分:1)
我比较了几个包(suntime、suntime、sunriset、astral)以及它们返回的日出和日落时间。它们都返回当地时间,但您也可以轻松获得 UTC 时间。 结果如下:
from datetime import date, datetime, timezone, timedelta
import pytz
import time
from suntime import Sun, SunTimeException
from suntimes import SunTimes
import sunriset
import astral, astral.sun
latitude = 52.0691667
longitude = 19.4805556
altitude = 0
tz_poland = pytz.timezone('Europe/Warsaw')
tz_name = 'Europe/Warsaw'
for_date = date(2021, 4, 6)
print('====== suntime ======')
abd = for_date
sun = Sun(latitude, longitude)
today_sr = sun.get_sunrise_time()
today_ss = sun.get_sunset_time()
print(today_sr.astimezone(tz_poland))
print(today_ss.astimezone(tz_poland))
print('====== suntimes ======')
sun2 = SunTimes(longitude=longitude, latitude=latitude, altitude=altitude)
day = datetime(for_date.year, for_date.month, for_date.day)
print(sun2.risewhere(day, tz_name))
print(sun2.setwhere(day, tz_name))
print('====== sunriset ======')
local = datetime.now()
utc = datetime.utcnow()
local_tz = float(((local - utc).days * 86400 + round((local - utc).seconds, -1))/3600)
number_of_years = 1
start_date = for_date
df = sunriset.to_pandas(start_date, latitude, longitude, 2, number_of_years)
for index, row in df.iterrows():
print(row['Sunrise'])
print(row['Sunset'])
break
print('====== astral ======')
l = astral.LocationInfo('Custom Name', 'My Region', tz_name, latitude, longitude)
s = astral.sun.sun(l.observer, date=for_date)
print(s['sunrise'].astimezone(tz_poland))
print(s['sunset'].astimezone(tz_poland))
和回报:
====== suntime ======
2021-04-06 06:05:00+02:00
2021-04-06 19:16:00+02:00
====== suntimes ======
2021-04-06 06:04:34.000553+02:00
2021-04-06 19:17:16.000613+02:00
====== sunriset ======
0 days 06:02:52.093465
0 days 19:16:49.892350
====== astral ======
2021-04-06 06:03:39.792229+02:00
2021-04-06 19:17:01.188463+02:00
请注意只有 suntimes 包支持海拔高度。
答案 2 :(得分:0)
您也可以尝试使用suntime。他们的文件如下:
import datetime
from suntime import Sun, SunTimeException
latitude = 51.21
longitude = 21.01
sun = Sun(latitude, longitude)
# Get today's sunrise and sunset in UTC
today_sr = sun.get_sunrise_time()
today_ss = sun.get_sunset_time()
print('Today at Warsaw the sun raised at {} and get down at {} UTC'.
format(today_sr.strftime('%H:%M'), today_ss.strftime('%H:%M')))
# On a special date in your machine's local time zone
abd = datetime.date(2014, 10, 3)
abd_sr = sun.get_local_sunrise_time(abd)
abd_ss = sun.get_local_sunset_time(abd)
print('On {} the sun at Warsaw raised at {} and get down at {}.'.
format(abd, abd_sr.strftime('%H:%M'), abd_ss.strftime('%H:%M')))