【问题标题】:PyEphem Sunrise and Sunset times wrong (python)PyEphem 日出和日落时间错误(python)
【发布时间】:2015-01-31 14:36:51
【问题描述】:

我在使用 pyEphem 获取我所在位置的准确日出和日落时间时遇到了一些困难。我已经阅读了一些问题和答案,并查看了文档,但仍然不完全清楚我做错了什么。代码如下:

import datetime as dt
import ephem as ep

date = dt.datetime.now().strftime("%Y/%m/%d 00:00:00")
lat, lon = [<redacted>, -1.4147]

# Use lat and lon to create ephem observer instance and update with given
# values
my_location = ep.Observer()
my_location.lat = lat
my_location.lon = lon
my_location.date = date

# Get sunrise of the current day
sunrise = my_location.next_rising(ep.Sun())
sunset = my_location.next_setting(ep.Sun())

print "Given date: {0}".format(date)
print "Detected coordinates: {0}, {1}".format(lat, lon)
print "Sunrise at {0}".format(sunrise)
print " Sunset at {0}".format(sunset)

产生这个输出:

Given date: 2015/01/31 00:00:00
Detected coordinates: <redacted>, -1.4147
Sunrise at 2015/1/31 12:28:02
 Sunset at 2015/1/31 22:47:39

我所期待的是获得午夜(今天早上)之后的第一次日出和之后的第一次日落的时间。现在我碰巧知道太阳在今天 12:30 之前升起(我在光天化日之下上午 9:30 走在路上),我不认为有 UTC 偏移,因为我知道我的时区。

我错过了什么?

【问题讨论】:

标签: python time pyephem


【解决方案1】:

如果您提供经度和纬度作为原始浮点数,那么 PyEphem 假定您已经完成了将它们转换为弧度的工作。值 1.4147 弧度几乎是绕地球一周的八分之一。如果您希望 PyEphem 为您转换度数,请尝试使用字符串来表示它们,而不是 PyEphem 将被强制转换:

lat, lon = [<redacted>, '-1.4147']

您可以通过打印回来检查一个值是否设置正确:

print my_location.lat
print my_location.lon

要求Observer 对象打印回其值是确定其设置是否正确的最佳方法。

您会注意到,新的 Skyfield 库从 PyEphem 的错误中学习,根本不进行自动转换,但需要将值明确指定为弧度或度数!

【讨论】:

  • 日期也应该是 UTC(或 UT1)(datetime.utcnow()ephem.now()),而不是本地时区(.now() 不正确,除非本地时区是 UTC)。
  • 啊,好吧,所以我需要以弧度而不是度数将角度传递给 pyephem?我没有意识到,因为 pyEphem 通常以度为单位打印角度。谢谢,我稍后会对此进行测试,看看它是否能解决我的问题。另外,@J.F.Sebastian 谢谢你,但我和其他评论者一起经历过:我知道我在哪个时区。
  • 谢谢你,成功了!接受 str 与 float 来表示不同的东西是一个糟糕的 API。也感谢您提及 Skyfield。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多