自Python以来的几周以来的GPS时间?

时间:2017-07-31 18:19:48

标签: python datetime time gps

我想从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是否提供了类似的库?

Wikipedia Entry on GPS Time

5 个答案:

答案 0 :(得分:3)

计算日差然后除以7

执行此操作的方法是使用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

https://hpiers.obspm.fr/eoppc/bul/bulc/Leap_Second.dat