如何从python当前日期的GPS时代获得闰秒 [英] How to get leap seconds from gps epoch for current date in python

查看:229
本文介绍了如何从python当前日期的GPS时代获得闰秒的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如我目前在Python中理解的那样,没有功能可以从当前日期的GPS时代获得闰秒。正在研究/开发的适当补丁:日期时间中的闰秒路径



您能否建议如何获得闰秒的最佳方式?我发现这个解决方案:

  def getLeapSec(Tgps):
daysFromGPSEpoch = timedelta(seconds = Tgps).days
tableLeapSec =([
[0,542,907,1272,2003,2917,3648,4013,4560,4925,5290,5839,6386,6935,9492,10588,11865,12960],
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
])

(1,len(tableLeapSec [0])):
if daysFromGPSEpoch< tableLeapSec [0] [i]:
return tableLeapSec [1] [i-1]

示例:

pre $ 在[25]中:Tgps = 1092121243.0

在[26]中:getLeapSec Tgps)
Out [26]:16


解决方案

如果你使用 leapseconds 模块可以在系统上访问最新的tzfile

 >>> from datetime import datetime,timedelta 
>>> import leapseconds
>>> Tgps = 1092121243.0
>>> gps_time = datetime(1980,1,6)+ timedelta(秒= Tgps)
>>> leapseconds.dTAI_UTC_from_tai(leapseconds.gps_to_tai(gps_time))
datetime.timedelta(0,35)

主要优点是系统会自动每年更新多次 tzdata 软件包(通常比闰秒更快)。您的代码将使用新数据,而无需更改它。



否则,作为回退,您可以硬编码跳跃结果。 leapseconds()调用:

 >>> import leapseconds 
>>> leapseconds()
[LeapSecond(utc = datetime.datetime(1972,1,1,0,0),dTAI_UTC = datetime.timedelta(0,10)),
LeapSecond(utc = datetime .datetime(1972,7,1,0,0),dTAI_UTC = datetime.timedelta(0,11)),
LeapSecond(utc = datetime.datetime(1973,1,1,0,0),dTAI_UTC = datetime.timedelta(0,12)),
LeapSecond(utc = datetime.datetime(1974,1,1,0,0),dTAI_UTC = datetime.timedelta(0,13)),
LeapSecond(utc = datetime.datetime(1975,1,1,0,0),dTAI_UTC = datetime.timedelta(0,14)),
LeapSecond(utc = datetime.datetime(1976,1,1,0 ,0),dTAI_UTC = datetime.timedelta(0,15)),
LeapSecond(utc = datetime.datetime(1977,1,1,0,0),dTAI_UTC = datetime.timedelta(0,16)) ,
LeapSecond(utc = datetime.datetime(1978,1,1,0,0),dTAI_UTC = datetime.timedelta(0,17)),
LeapSecond(utc = datetime.datetime(1979, 1,1,0,0),dTAI_UTC = datetime.timedelta(0,18)),
LeapSecond(utc = datetime.datetime(1980,1,1,0,0),dTAI_UTC = datetime.timedelta( 0,19)),
LeapSecond(utc = dat etime.datetime(1981,7,1,0,0),dTAI_UTC = datetime.timedelta(0,20)),
LeapSecond(utc = datetime.datetime(1982,7,1,0,0), dTAI_UTC = datetime.timedelta(0,21)),
LeapSecond(utc = datetime.datetime(1983,7,1,0,0),dTAI_UTC = datetime.timedelta(0,22)),
LeapSecond(utc = datetime.datetime(1985,7,1,0,0),dTAI_UTC = datetime.timedelta(0,23)),
LeapSecond(utc = datetime.datetime(1988,1,1, 0,0),dTAI_UTC = datetime.timedelta(0,24)),
LeapSecond(utc = datetime.datetime(1990,1,1,0,0),dTAI_UTC = datetime.timedelta(0,25) ),
LeapSecond(utc = datetime.datetime(1991,1,1,0,0),dTAI_UTC = datetime.timedelta(0,26)),
LeapSecond(utc = datetime.datetime(1992) ,7,1,0,0),dTAI_UTC = datetime.timedelta(0,27)),
LeapSecond(utc = datetime.datetime(1993,7,1,0,0),dTAI_UTC = datetime.timedelta (0,28)),
LeapSecond(utc = datetime.datetime(1994,7,1,0,0),dTAI_UTC = datetime.timedelta(0,29)),
LeapSecond(utc = datetime.datetime(1996,1,1,0,0),dTAI_UTC = datetim e.timedelta(0,30)),
LeapSecond(utc = datetime.datetime(1997,7,1,0,0),dTAI_UTC = datetime.timedelta(0,31)),
LeapSecond (utc = datetime.datetime(1999,1,1,0,0),dTAI_UTC = datetime.timedelta(0,32)),
LeapSecond(utc = datetime.datetime(2006,1,1,0, 0),dTAI_UTC = datetime.timedelta(0,33)),
LeapSecond(utc = datetime.datetime(2009,1,1,0,0),dTAI_UTC = datetime.timedelta(0,34)),
LeapSecond(utc = datetime.datetime(2012,7,1,0,0),dTAI_UTC = datetime.timedelta(0,35)),
LeapSecond(utc = datetime.datetime(2015,7 ,1,0,0),dTAI_UTC = datetime.timedelta(0,36))]

您在这种情况下引入下一个闰秒时必须手动更新列表。

闰秒更新的权威来源是自1961年以来的TAI-UTC数据



您可以在半年(例如1月,7月)以编程方式使用 leap_second_client.py 查找当下一个闰秒计划。

As I understand for now in python there is no function to get leap seconds from gps epoch for current date. The appropriate patch under investigation/development: leap seconds path in datetime

Could you advice the best way how to get leap seconds? I found that solution:

def getLeapSec(Tgps):
  daysFromGPSEpoch = timedelta(seconds=Tgps).days
  tableLeapSec = ([
    [0,  542,  907, 1272, 2003, 2917, 3648, 4013, 4560, 4925, 5290, 5839, 6386, 6935, 9492, 10588, 11865, 12960],
    [0,    1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11,   12,   13,   14,    15,    16,    17]
                 ])

  for i in range(1, len(tableLeapSec[0])):
    if daysFromGPSEpoch < tableLeapSec[0][i]:
      return tableLeapSec[1][i-1]

Example:

In [25]: Tgps = 1092121243.0

In [26]: getLeapSec(Tgps)
Out[26]: 16

解决方案

You could use leapseconds module if you have access to the up-to-date tzfile on your system:

>>> from datetime import datetime, timedelta
>>> import leapseconds
>>> Tgps = 1092121243.0
>>> gps_time = datetime(1980, 1, 6) + timedelta(seconds=Tgps)
>>> leapseconds.dTAI_UTC_from_tai(leapseconds.gps_to_tai(gps_time))
datetime.timedelta(0, 35)

The main advantage is that tzdata package is updated several times per year by the system automatically (more often than leap seconds are introduced). Your code will use the new data without the need to change it.

Otherwise, as a fallback, you could hardcode the result of the leapseconds.leapseconds() call:

>>> import leapseconds
>>> leapseconds.leapseconds()
[LeapSecond(utc=datetime.datetime(1972, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 10)),
 LeapSecond(utc=datetime.datetime(1972, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 11)),
 LeapSecond(utc=datetime.datetime(1973, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 12)),
 LeapSecond(utc=datetime.datetime(1974, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 13)),
 LeapSecond(utc=datetime.datetime(1975, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 14)),
 LeapSecond(utc=datetime.datetime(1976, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 15)),
 LeapSecond(utc=datetime.datetime(1977, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 16)),
 LeapSecond(utc=datetime.datetime(1978, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 17)),
 LeapSecond(utc=datetime.datetime(1979, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 18)),
 LeapSecond(utc=datetime.datetime(1980, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 19)),
 LeapSecond(utc=datetime.datetime(1981, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 20)),
 LeapSecond(utc=datetime.datetime(1982, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 21)),
 LeapSecond(utc=datetime.datetime(1983, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 22)),
 LeapSecond(utc=datetime.datetime(1985, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 23)),
 LeapSecond(utc=datetime.datetime(1988, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 24)),
 LeapSecond(utc=datetime.datetime(1990, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 25)),
 LeapSecond(utc=datetime.datetime(1991, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 26)),
 LeapSecond(utc=datetime.datetime(1992, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 27)),
 LeapSecond(utc=datetime.datetime(1993, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 28)),
 LeapSecond(utc=datetime.datetime(1994, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 29)),
 LeapSecond(utc=datetime.datetime(1996, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 30)),
 LeapSecond(utc=datetime.datetime(1997, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 31)),
 LeapSecond(utc=datetime.datetime(1999, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 32)),
 LeapSecond(utc=datetime.datetime(2006, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 33)),
 LeapSecond(utc=datetime.datetime(2009, 1, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 34)),
 LeapSecond(utc=datetime.datetime(2012, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 35)),
 LeapSecond(utc=datetime.datetime(2015, 7, 1, 0, 0), dTAI_UTC=datetime.timedelta(0, 36))]

You have to update the list manually when the next leap second is introduced in this case.

The authoritative source for the leap seconds updates is Bulletin C issued by IERS that also provides TAI-UTC data since 1961.

You could ping IESR once in a half-year (e.g., January, July), to find out programmatically using leap_second_client.py when the next leap second is scheduled.

这篇关于如何从python当前日期的GPS时代获得闰秒的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆