在Python的日出和日落时间

bka*_*glu 5 python time datetime raspberry-pi

我目前正在开发一个项目,该项目会在触发与光相关的某些活动时通知用户.我做过与光有关的部分.因此,我需要找到一种有效的方法来检索python中的日出和日落时间,因为整个脚本是用python编写的.我知道有几个库用于其他语言,我想知道在python中最方便的方法是做什么.

我想这看起来很像这样:

if(sunrise<T<sunset) and (light<threshold):
    notifyUser()
Run Code Online (Sandbox Code Playgroud)

我很感激这里的任何帮助,有一个好的.

Woj*_*bas 15

我比较了几个包(suntimesuntimessunrisetastral)以及它们返回的日出和日落时间。它们都返回当地时间,但您也可以轻松获取 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))
Run Code Online (Sandbox Code Playgroud)

和回报:

====== 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
Run Code Online (Sandbox Code Playgroud)

请注意,仅 suntimes 套餐支持海拔高度。


Kev*_*don 11

看看星界.以下是他们的文档中略有修改的示例:

>>> 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()
Run Code Online (Sandbox Code Playgroud)

如果您使用此示例,请记住更改city_name提供的日期和日期city.sun.


use*_*654 11

上面的包Astral示例似乎已过时。

Astral v2.2以下是加利福尼亚州圣何塞机场位置的示例。

首先,设置观察者的位置:

from astral import LocationInfo
loc = LocationInfo(name='SJC', region='CA, USA', timezone='America/Los_Angeles',
                   latitude=37.3713439, longitude=-121.944675)
print(loc)
# LocationInfo(name='SJC', region='CA, USA', timezone='America/Los_Angeles',
#   latitude=37.3713439, longitude=-121.944675)
print(loc.observer)
# Observer(latitude=37.3713439, longitude=-121.944675, elevation=0.0)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 只有纬度、经度和时区很重要。
  • 名称和地区只是标签。

接下来,计算该观察者在所需日期(例如下面的 2021-01-15)的太阳信息:

import datetime
from astral.sun import sun
s = sun(loc.observer, date=datetime.date(2021, 1, 15), tzinfo=loc.timezone)
for key in ['dawn', 'dusk', 'noon', 'sunrise', 'sunset']:
    print(f'{key:10s}:', s[key])
Run Code Online (Sandbox Code Playgroud)

输出:

dawn      : 2021-01-15 06:52:04.342105-08:00
dusk      : 2021-01-15 17:42:59.471441-08:00
noon      : 2021-01-15 12:17:05-08:00
sunrise   : 2021-01-15 07:21:04.877697-08:00
sunset    : 2021-01-15 17:13:58.467348-08:00
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果未指定时区,则默认为 UTC。
  • 正午是太阳正午——太阳穿过观察者所在位置的子午线的时间。
  • Astral是NOAA 发布的Excel 工作表的实现。


小智 6

您也可以尝试使用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')))
Run Code Online (Sandbox Code Playgroud)