我想从Unix时间转换为GPS时间,即在Python中计算自GPS时代(1980年1月6日)开始以来的周数。我不是在寻找一年中的几周,而是1980年以来的几周。
开始我的尝试是通过使用time.time()来返回自1970年纪元以来的时间(称为Unix时间)并从该纪元和GPS启动之间经过的秒数中减去时间来获得经过的秒数。日期。
这会返回自1980年以来的正确值(以秒为单位),但我想要GPS周数。是否有一个返回此标准的Python函数?
备注
GPS日期表示为自纪元以来的周数和周秒数。 GPS时代不同 - 1980年1月6日00:00:00。此外," GPS计数周数"从纪元开始 - 一个GPS周定义为星期日开始。注意:1月6日是1980年的第一个星期日。1
Unix时间系统的时间为1970年1月1日00:00:00,ISO将一年中的第一周定义为 - "包含1月第4天的那个,相当于说这是新年重叠至少四天的第一周"。
还有其他时间系统,尤其是J2000。从一个时间系统转换到另一个系统是非常重要的。
为了处理GPS Time,Perl提供了DateTime :: Precise库,它通过额外的GPS操作执行常见的时间和日期操作。问题是,Python是否提供了类似的库?
答案 0 :(得分:3)
执行此操作的方法是使用python的datetime
模块。其中一个有用的功能是,它允许您使用date.days
获取日期并将其转换为若干天。使用这些天,我们可以减去它们并除以7
(一周中的天数:p)以获得它们之间的几周。
但是,在将每个转换为几天之前,您需要先从一周中的date
减去Monday
。这将为您提供该周from datetime import date, timedelta
epoch = date(1980, 1, 6)
today = date.today()
epochMonday = epoch - timedelta(epoch.weekday())
todayMonday = today - timedelta(today.weekday())
的日期,这将消除一个错误。
为此,您可以执行以下操作:
Monday
现在您已经拥有了他们周的7
日期,您需要减去它们以找出差异并除以noWeeks = (todayMonday - epochMonday).days / 7
以获得周数。
这给出了最终输出:
{{1}}
答案 1 :(得分:2)
@Dave X的答案def utctoweekseconds(utc,leapseconds):
很好,但是您需要在tdiff = utc -epoch -datetime.timedelta(seconds=leapseconds)
中添加时间增量,而不要减去(GPS时间早于UTC)。如果您添加日期时间而不是减去日期时间,则该功能会完美运行。
当我通过该函数运行计算机的datetime.utcnow()并将其与我连接到该设备的GPS接收器的时间进行比较时,我注意到了这一点,它们最初关闭了36秒(是leap秒的两倍) )。
2014-09-22 21:36:52是GPS星期为164212,而不是164196(根据https://www.labsat.co.uk/index.php/en/gps-time-calculator)。
(对不起,我无法发表评论,我没有足够的声誉)
正确的功能:
def utctoweekseconds(utc,leapseconds):
""" Returns the GPS week, the GPS day, and the seconds
and microseconds since the beginning of the GPS week """
import datetime, calendar
datetimeformat = "%Y-%m-%d %H:%M:%S"
epoch = datetime.datetime.strptime("1980-01-06 00:00:00",datetimeformat)
tdiff = utc -epoch + datetime.timedelta(seconds=leapseconds)
gpsweek = tdiff.days // 7
gpsdays = tdiff.days - 7*gpsweek
gpsseconds = tdiff.seconds + 86400* (tdiff.days -7*gpsweek)
return gpsweek,gpsdays,gpsseconds,tdiff.microseconds
答案 2 :(得分:1)
关于gist的反函数:https://gist.github.com/jeremiahajohnson/eca97484db88bcf6b124
def weeksecondstoutc(gpsweek,gpsseconds,leapseconds):
import datetime, calendar
datetimeformat = "%Y-%m-%d %H:%M:%S"
epoch = datetime.datetime.strptime("1980-01-06 00:00:00",datetimeformat)
elapsed = datetime.timedelta(days=(gpsweek*7),seconds=(gpsseconds+leapseconds))
return datetime.datetime.strftime(epoch + elapsed,datetimeformat)
weeksecondstoutc(1811,164196.732,16) ## --> '2014-09-22 21:36:52'
请注意,此解决方案手动考虑POSIX和TAI之间的闰秒差异。 (有关闰秒,请参阅https://en.wikipedia.org/wiki/Leap_second)Leapseconds可在https://stackoverflow.com/a/33445945/1653571中使用,但此代码不能使用它。
因此,从unix时间转换回GPS也需要关注闰秒:
def utctoweekseconds(utc,leapseconds):
""" Returns the GPS week, the GPS day, and the seconds
and microseconds since the beginning of the GPS week """
import datetime, calendar
datetimeformat = "%Y-%m-%d %H:%M:%S"
epoch = datetime.datetime.strptime("1980-01-06 00:00:00",datetimeformat)
tdiff = utc -epoch -datetime.timedelta(seconds=leapseconds)
gpsweek = tdiff.days // 7
gpsdays = tdiff.days - 7*gpsweek
gpsseconds = tdiff.seconds + 86400* (tdiff.days -7*gpsweek)
return gpsweek,gpsdays,gpsseconds,tdiff.microseconds
utctoweekseconds(datetime.datetime.strptime('2014-09-22 21:36:52',"%Y-%m-%d %H:%M:%S"),16)
## gives: (1811, 1, 164196,0)
我也需要GPS周的那一天,因为我正在计算来自https://cddis.nasa.gov/Data_and_Derived_Products/GNSS/orbit_and_clock_products.html& c的GPS时钟和轨道文件的文件名。
答案 3 :(得分:0)
您可以通过以下方式尝试gnsscal
模块:
$ pip install gnsscal
然后按如下方式使用它:
>>> import gnsscal
>>> import datetime
>>> day = datetime.date(2019, 2, 22)
>>> gnsscal.date2gpswd(day)
(2041, 5)
但是,如果要将UTC转换为GPS时间,则存在一些差异,称为leap秒,您可以从IERS获取leap秒的信息。
答案 4 :(得分:0)
我想添加一个熊猫解决方案
UTCtime =pd.to_datetime("1980-01-06 00:00:00")+pd.Timedelta(weeks=week)+pd.Timedelta(seconds=seconds)-pd.Timedelta(seconds=leapseconds)
当前,the秒值为37