9

我已经查看了使用 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 初学者,坦率地说,我不是一个程序员。

任何建议都将受到欢迎!

4

4 回答 4

9

太阳正午不是日出和日落的平均值(解释见时间方程)。该ephem软件包具有获取运输时间的方法,您应该使用这些方法:

>>> 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包中的日期,如果它是正确的做法。)

于 2010-11-06T19:30:18.110 回答
2

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

>>> 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)
于 2020-06-04T09:03:18.157 回答
0

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

于 2010-11-02T22:36:17.327 回答
0

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

于 2013-04-28T21:32:32.453 回答