将 TLE 时间(十进制天数)转换为纪元后的秒数
Posted
技术标签:
【中文标题】将 TLE 时间(十进制天数)转换为纪元后的秒数【英文标题】:Convert TLE times (decimal days) to seconds after epoch 【发布时间】:2016-01-18 07:14:34 【问题描述】:标准的两行元素 (TLE) 格式包含 2 位数年份加上小数天的时间,因此 16012.375
将是 2016 年 1 月 12 日 09:00。使用 python 的 time
或 datatime
模块,如何将其转换为纪元后的秒数?我认为我应该使用结构化时间,但我不确定如何使用。 seconds_of
是一个虚构的功能 - 需要用真实的东西替换。
编辑:如果答案很长(冗长),这将是最有帮助的 - 比如每行一步左右,所以我可以理解发生了什么。
编辑 2:在看到 @J.F.Sebastian 的 cmets 后,我查看了 TLE 的链接,发现它没有任何地方显示“UTC”。所以我应该指出初始信息和最终信息是UTC。 没有参考本地时间、时区或系统时间。
例如
tim = "16012.375"
year = 2000 + int(tim[0:2])
decimal_days = float(tim[2:])
print year, decimal_days
2016, 12.375
# seconds_of is a fictitious function - need to replace with something real
seconds_after_epoch = seconds_of(2016,1,1) + (3600. * 24.) * decimal_days
【问题讨论】:
【参考方案1】:您可以尝试这样的事情 [根据 cmets 进行编辑]。
import datetime
import time
# get year 2 digit and floating seconds days
y_d, nbs = "16012.375".split('.')
# parse to datetime (since midnight and add the seconds) %j Day of the year as a zero-padded decimal number.
d = datetime.datetime.strptime(y_d, "%y%j") + datetime.timedelta(seconds=float("." + nbs) * 24 * 60 * 60)
# 1.0 => 1 day
# from time tuple get epoch time.
time.mktime(d.timetuple())
#1481896800.0
【讨论】:
太棒了!也感谢您添加解释。 不错,但不应该是strptime(y_d, "%y%j")
吗?根据文档 (docs.python.org/2/library/…),%j
将一年中的某一天表示为 0 填充小数。对于timedelta
,不应该是seconds = float("."+nbs)*24*60*60
吗?
好的,我现在在一台真正的电脑前。确实@mtrw,print d
返回datetime.datetime(2016, 12, 16, 15, 0)
这是不对的。如果我们每行一次执行此步骤,这对我最有帮助 - 也有助于调试。
float("."nbs) 与 float("." + "375") 完全一样
仅供参考,我刚刚问了follow up question【参考方案2】:
给定year
和decimal_days
很容易得到datetime
对象:
>>> from datetime import datetime, timedelta
>>> year = 2016
>>> decimal_days = 12.375
>>> datetime(year, 1, 1) + timedelta(decimal_days - 1)
datetime.datetime(2016, 1, 12, 9, 0)
如何将datetime
对象转换为“自纪元以来的秒数”取决于时区(本地、UTC 等)。请参阅Converting datetime.date to UTC timestamp in Python,例如,如果您的输入是 UTC,那么很容易获得“自纪元以来的秒数”:
>>> utc_time = datetime(2016, 1, 12, 9, 0)
>>> (utc_time - datetime(1970, 1, 1)).total_seconds()
1452589200.0
【讨论】:
谢谢!我现在才看到这个。在这种情况下,我只转换 UTC 值的格式,所以我可以使用time.mktime(timetuple)
我刚刚问过 follow up question
@uhoh 我的回答中链接的帖子明确表示您不应将mktime()
与UTC时间一起使用。点击链接。
再次感谢。您能否缩小到您所指的七个答案中的哪一个?这也将对这个问题的未来读者有所帮助。
@uhoh :我指的是最顶部的接受最多投票的答案,上面有我的名字。
@uhoh:我已经添加了关于如何从 UTC 时间获取“纪元以来的秒数”的明确公式。这不是mktime()
中的错误。 mktime()
接受 local 时间(因此,除非您的本地时区是 UTC,否则不应将其与 UTC 时间一起使用)。 @Ali SAID OMAR's answer 是错误的,因为它使用了mktime()
。以上是关于将 TLE 时间(十进制天数)转换为纪元后的秒数的主要内容,如果未能解决你的问题,请参考以下文章
将 Zulu 时间戳转换为自纪元以来的秒数,并将其与 bash 脚本 Mac 中的当前时间进行比较