将 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 的 timedatatime 模块,如何将其转换为纪元后的秒数?我认为我应该使用结构化时间,但我不确定如何使用。 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】:

给定yeardecimal_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 中的当前时间进行比较

在linux bash中将ISO日期转换为纪元以来的秒数

从纪元到相对日期的秒数

使用 strftime 将 python 日期时间转换为纪元

如何通过添加时间偏移值在php中使用纪元时间

将 UNIX 纪元转换为日期对象