首页 文章

从Python开始的几周以来的GPS时间?

提问于
浏览
0

我想从Unix时间转换为GPS时间,即计算自Python时代(1980年1月6日)开始以来的Python周数 . 我不是在寻找一年中的几周,而是1980年以来的几周 .

开始我的尝试是通过使用time.time()返回自1970年纪元以来的时间(称为Unix时间)并从该纪元和GPS开始日期之间经过的秒数中减去它来获得经过的秒数 .

这将返回一个正确的值,以秒为单位,自1980年以来的时间,但我想要GPS周数 . 是否有一个标准的Python函数返回这个?

NOTES

GPS日期表示为自纪元以来的周数和周秒数 . GPS时代不同 - 1980年1月6日00:00:00 . 此外,"GPS counts weeks"自纪元以来 - 一周的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

2 回答

  • 1

    一个反函数可用于要点: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

    计算日差然后除以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
    

相关问题