使用Python中的ephem从日期时间索引计算日出和日落时间

3

我有一组以DateTime为索引的每日时间序列。我想要计算DataFrame中每一天的日出和日落时间。结果将会呈现在riseset两列中。以下是使用pyephem编写的脚本:

import ephem
import datetime

AliceS = ephem.Observer()
AliceS.lat = '-23.762'
AliceS.lon = '133.875'

AliceS.date = df.index

sun = ephem.Sun()

df['rise'] = ephem.localtime(AliceS.next_rising(sun))
df['set'] = ephem.localtime(AliceS.next_setting(sun))

这引发了

ValueError: dates must be initialized from a number, string, tuple, or datetime

我认为错误的原因是AliceS.date = df.index,但是我不知道该如何解决它。

下面是 datetime 索引的一个示例:

DateTime
2016-04-02
2016-04-03
2016-04-04
2016-04-07
2016-04-08
1个回答

2
docs的首页上可以看到以下内容:

PyEphem 无法与 NumPy 进行互操作,因此在现代 IPython Notebook 中使用起来很麻烦。

这基本上意味着next_risingnext_setting方法只能针对标量进行操作。快速且简单的解决方案是编写一个循环,将索引的每个元素转换为兼容格式并以此计算值:
import ephem
import datetime

AliceS = ephem.Observer()
AliceS.lat = '-23.762'
AliceS.lon = '133.875'

sun = ephem.Sun()

def get_time(obs, obj, func):
    func = getattr(obs, func)
    def inner(date)
        obs.date = date
        return ephem.localtime(func(obj))
    return inner

df['rise'] = pd.Series(df.index).apply(get_time(AliceS, sun, 'next_rising'))
df['set'] = pd.Series(df.index).apply(get_time(AliceS, sun, 'next_setting'))

不要被紧凑的符号所迷惑,apply仍然只是一个for循环。
一个更好的解决方案是遵循文档中的建议:

如果可能的话,我建议使用Skyfield而不是PyEphem!(目前唯一缺少的是从Kelperian轨道元素预测彗星和小行星的位置。)

这里是Skyfield的链接。它可以通过正常渠道获取,如pypiGitHub

物理学家。感谢介绍Skyfield,让我找到了解决问题的方法。 - k.ko3n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接