【问题标题】:Pulling ephem.next_rising(sun) for various lat/long locations around the world为世界各地的各种纬度/经度地点拉 ephem.next_rising(sun)
【发布时间】:2014-11-28 04:10:30
【问题描述】:

我想设置一个 Python 程序,以便能够从不同位置提取日出/日落,以触发本地位置的灯光,以象征远程日出 - 如果你真的在那里。 我的意思是,如果您住在柏林,并且您在 12 月中旬的日出/日落时间是上午 7:45/下午 4:15,那么您可以有一个小 LED,当一些热带日出发生时会亮起(比如夏威夷)。但这是根据您自己的当地时间发生的。

因此,使用 Python 的 ephem、pytz 和 localtime,提取各个位置的日出/日落信息,并根据每个位置触发事件。

我设置了一个测试程序,使用不列颠哥伦比亚省的温哥华和法属圭亚那的乔治敦作为测试用例,并且大部分情况下它都能正常工作 - 但乔治敦的日出/日落完全错误。

您可以将整个内容剪切并粘贴到 Python 窗口中进行测试,请原谅无关的时间调用,但我觉得看看每个时间调用 pull 的内容很有趣。

尽管如此,您会看到 Guyana.date 是绝对正确的,但日出/日落大约是 1:53 AM / 13:57 PM,完全被破坏了。 关于这怎么会变得如此可怕,可怕的错误的任何想法?

已编辑删除不必要的代码

import ephem
from datetime import datetime, timedelta
from pytz import timezone
import pytz
import time 

Guyana = ephem.Observer()
Guyana.lat = '5'
Guyana.lon = '58.3'
Guyana.horizon = 0
Guyana.elevation = 80 
Guyana.date = datetime.utcnow()

sun = ephem.Sun()


print("Guyana.date is ",Guyana.date)
print("Guyana sunrise is at",Guyana.next_rising(sun))
print("Guyana sunset is going to be at ",Guyana.next_setting(sun))

这样的结果如下:

Guyana.date is  2014/10/4 16:47:36
Guyana sunrise is at 2014/10/5 01:53:26
Guyana sunset is going to be at  2014/10/5 13:57:05

这有什么问题,今天圭亚那的实际日出时间是早上 5:40,所以 1:53:26 的时间不只是几个小时,而是在很多方面。

【问题讨论】:

    标签: python timezone pytz pyephem


    【解决方案1】:

    要回答您的更新版本:正经度指的是东,但圭亚那(美国)位于格林威治的西边,因此您应该使用减号:Guyana.lon = '-58.3',然后日出时间变为:

    Guyana sunrise is at 2014/10/5 09:39:47
    

    时间为 UTC,您可以将其转换为当地(圭亚那)时间:

    >>> utc_dt = Guyana.next_rising(sun).datetime().replace(tzinfo=pytz.utc)
    >>> print(utc_dt.astimezone(pytz.timezone('America/Guyana')))
    2014-10-05 05:39:46.673263-04:00
    

    当地时间上午 5:40 日出似乎是合理的。


    来自ephem documentation

    日期始终使用世界时,从不您当地的时区。

    正如我所说的in my answer to your previous question

    您应该将 datetime.utcnow() 传递给观察者,而不是您的本地时间。

    即,Vancouver.date = now 是错误的,因为您使用 datetime.now() 返回一个幼稚的本地时间(通过 datetime.utcnow()(或 ephem.now())代替),Guyana.date = utc_dt.astimezone(FrenchGuyanaTZ) 是错误的,因为 FrenchGuyanaTZ 时区可能有非零 UTC 偏移量(仅传递 utc_dt)。

    无关:找到当前时间的时间戳的正确方法是time.time(),即gmNow 应该等于timetimeNow(总是)。作为I said

    您应该使用time.time() 而不是time.mktime(time.localtime()),后者可能会在夏令时转换期间返回错误结果。

    在 UTC 中查找当前时间的正确方法是:

    utc_dt_naive = datetime.utcnow()
    

    或者,如果您需要一个可感知的日期时间对象:

    utc_dt = datetime.now(utc_timezone)
    

    【讨论】:

    • 你靠什么谋生,让你走上了如此多的 UTC 知识之路?? :) 幸运的是,在天真和有意识的情况下,我计划用于远程日落时间的所有时区都是赤道的,并且不要使用 DST(谢天谢地)。我认为现在出现的任何问题可能与 ehem 有更多关系,而不是 pytz,因为圭亚那的日期/时间是正确的,但日出显然是在凌晨 1:53。
    • @Octoth0rpe:对不起,不是我。 ephem 的文档需要 UTC 时区(我已在答案中添加了直接引用)。假设ephempytzdatetime 是正确的,而您使用它们是错误的——库中存在错误,但在您有更多经验之前,实际错误更有可能在您的代码中。关于圭亚那:获取 UTC 的日出时间,然后将其转换为圭亚那的时区(凌晨 1 点 53 分是什么? - 是您当地时区的时间,UTC,圭亚那的时区吗?)
    • 谢谢 J.F,我什至没有讽刺,我是认真的。围绕 UTC/Datetime 等所有不同风格的讨价还价的数量让我措手不及,我对那些像你一样有头脑的人感到谦卑。圭亚那凌晨 1 点 53 分日出的奇怪之处在于,它甚至只差几小时甚至几分钟。今天的日出实际上是早上 5 点 40 分,但 ehem 报告说它发生在 1 点 53 分。
    • 编辑了我最初的问题,将其细化到具体细节。
    • 好的,这有帮助。圭亚那经度的十进制度实际上是“-58”,而不是“+58”。现在我得到了正确的日出时间,但在我自己的当地时间。更近了一步! Guyana.date is 2014/10/4 18:44:12 Guyana 日出时间是 2014/10/5 09:40:07 Guyana 日落时间是 2014/10/4 21:43:27
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2020-08-05
    • 2014-07-18
    • 2015-04-26
    • 2011-03-06
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多