使用ephem计算“Solar Noon”,转换为当地时间

时间:2010-11-02 22:09:10

标签: python datetime astronomy

我看过这里的例子,用ephem来计算日出和日落,并让它运作得很好。

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

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)

我明白了:

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

那就是我被困住的地方。我是一个蟒蛇初学者,坦率地说,他不是一般的程序员。

欢迎任何建议!

4 个答案:

答案 0 :(得分:8)

太阳正午 日出和日落的平均值(有关说明,请参阅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包中轻松操作日期,如果这是正确的事情。)

答案 1 :(得分:1)

如果不是很容易使用短暂时间,我最近编写了一个名为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 :(得分:0)

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

答案 3 :(得分:0)

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