【问题标题】:Calculate "Solar Noon" using ephem, translating to local time使用 ehem 计算“太阳正午”,转换为当地时间
【发布时间】:2011-05-04 05:02:06
【问题描述】:

我已经查看了使用 ehem 计算日出和日落的示例,并且效果很好。

当我尝试计算这两次之间的中点时,我遇到了麻烦。这是我所拥有的:

import datetime
import ephem

o = ephem.Observer()
o.lat, o.long, o.date = '37.0625', '-95.677068', datetime.datetime.utcnow()
sun = ephem.Sun(o)
print "sunrise:", o.previous_rising(sun), "UTC"
print "sunset:",o.next_setting(sun), "UTC"
print "noon:",datetime.timedelta((o.next_setting(sun)-o.previous_rising(sun))/2)

我明白了:

日出:2010/11/2 12:47:40 UTC
日落:2010/11/2 23:24:25 UTC
中午:5:18:22.679044

这就是我卡住的地方。我是一个 Python 初学者,坦率地说,我不是一般的程序员。

欢迎提出任何建议!

【问题讨论】:

    标签: python datetime astronomy pyephem


    【解决方案1】:

    如果使用 ephem 不是硬性要求,我最近编写了一个名为 daylight 的库,它具有直接用于太阳正午的本机函数。

    >>> import daylight, pytz
    >>> from datetime import datetime
    >>> sun = daylight.Sunclock(37.0625, -95.677068)
    >>> t = sun.solar_noon(datetime.utcnow().timestamp())
    >>> datetime.utcfromtimestamp(t)
    datetime.datetime(2020, 6, 4, 18, 20, 54)
    

    上述时间不是 UTC 时间。对于更合适的时区,比如 EST,您可以这样做:

    >>> tz = pytz.timezone('EST')
    >>> tz_offset = tz.utcoffset(datetime.utcnow()).total_seconds()/3600
    >>> sun = daylight.Sunclock(37.0625, -95.677068, tz_offset)
    >>> t = sun.solar_noon(datetime.utcnow().timestamp())
    >>> datetime.utcfromtimestamp(t).astimezone(tz)
    datetime.datetime(2020, 6, 3, 7, 50, 54, tzinfo=<StaticTzInfo 'EST'>)
    

    或在特定日期执行此操作,例如 2020 年 5 月 21 日

    >>> t = sun.solar_noon(datetime(2020, 5, 21).timestamp())
    >>> datetime.utcfromtimestamp(t)
    datetime.datetime(2020, 5, 20, 18, 19, 14)
    

    【讨论】:

    • 干得好!这个包对我很有效。
    【解决方案2】:

    我意识到这个问题很久以前就有了。但是对于那些可能使用任何代码或不太了解 Python 的人的答案,对于时间方程的目的有一个简单的解释。你的平均太阳凌日(中午)发生在你的纵向位置。这意味着知道您的经度,您可以通过将您的经度除以 15.0 并从 12 中减去该值来找到您的平均太阳过境,如果您愿意,这将是 GMT 或 UTC 的结果,以给出小时十进制时间。你真正的太阳过境是从平均值中减去时间方程的结果。通常,您无论如何都需要计算它以获得日出和日落时间,如维基百科公式中所示。但是感谢 python 包信息,因为我在使用 sunpy 包时遇到了一些麻烦。这里有一个关于 bitbucket 的很棒的程序 https://bitbucket.org/cmcqueen1975/sundials/wiki/Home

    【讨论】:

      【解决方案3】:

      太阳正午不是日出和日落的平均值(解释见equation of time)。 ephem 包有 methods for getting transit times 你应该使用它:

      >>> import ephem
      >>> o = ephem.Observer()
      >>> o.lat, o.long = '37.0625', '-95.677068'
      >>> sun = ephem.Sun()
      >>> sunrise = o.previous_rising(sun, start=ephem.now())
      >>> noon = o.next_transit(sun, start=sunrise)
      >>> sunset = o.next_setting(sun, start=noon)
      >>> noon
      2010/11/6 18:06:21
      >>> ephem.date((sunrise + sunset) / 2)
      2010/11/6 18:06:08
      

      请注意,今天中午(在您所在的位置)比日出和日落的平均值晚 13 秒。

      (代码行ephem.date((sunrise + sunset) / 2) 展示了如何轻松地操作ephem 包中的日期,如果这是正确的做法。)

      【讨论】:

      • 如果你在北(或南)足够远以至于今天太阳没有升起,你的日出计算就不会“工作”......(例如今天是 7 月 8 日,但最后一个日出是 5 月 17 日 :-)
      • 是的,我看到了问题:ephem.AlwaysUpError: 'Sun' is still above the horizon at 2011/7/8 00:04:58
      【解决方案4】:

      两个数字的平均值是两个数字的总和除以二,而不是日光长度除以二。如果您将其添加到 o.previous_rising(sun) 中,这也可以工作,但这应该与采用直接平均相同(我们正在平均日期时间对象并不重要)

      【讨论】:

        猜你喜欢
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 2015-07-14
        相关资源
        最近更新 更多