跳转到主要内容

为任何期望的时间生成WWVB时间码

项目描述

Test wwvbgen codecov Update DUT1 data PyPI CodeQL pre-commit.ci status

目的

wwvbpy为任何期望的时间生成WWVB时间码。这些时间码可能对测试WWVB解码软件很有用。

在可能的情况下,wwvbpy使用现有的日历和时间操作功能(datetime和dateutil)。

它使用来自IERS公告"A"和NIST的"闰秒和UT1-UTC信息"页的DUT1/闰秒数据。通过定期更新"iersdata",wwvbpy应该能够正确地编码100年WWVB纪元内的任何时间。是的,WWVB使用两位数字的年份!为了与历史数据兼容,纪元被任意设定为从1970年到2069年。

程序包括

  • wwvbgen,主要命令行生成程序
  • wwvbdecode,主要命令行解码程序
  • wwvbtk,使用Tkinter实时可视化模拟的WWVB信号
  • dut1table,打印dut1值的完整历史记录,包括估计的未来值
  • updateiers,下载最新的dut1数据,包括来自IERS和NIST的预期数据

该软件包包括

  • wwvb,用于生成WWVB时间码
  • wwvb.decode,基于生成器的状态机,用于解码WWVB时间码(仅限幅度调制)
  • uwwvb,解码器的版本,旨在用于受限制的环境,如CircuitPython

开发状态

作者(@jepler)偶尔开发和维护此项目,但不太可能对问题作出反应。他们有兴趣添加共同维护者。

WWVB时间码

美国国家标准与技术研究院在科罗拉多州福特科林斯附近运营WWVB时间信号服务。该信号可在北美大陆的大部分地区接收。每分钟,信号会传输当前时间,包括闰年、夏令时和闰秒等信息。该信号由一个幅度通道和一个相位调制通道组成。

幅度通道可以看作是一系列(通常为60个)符号,默认情况下,wwvbgen将其显示为0、1或2。0和1编码当前年份中的日期信息,而2在固定的位置出现,以便接收器确定分钟的起始。

相位通道(使用--channel=phase--channel=both显示)每分钟包含相同数量的符号。这个通道比幅度通道复杂得多。它编码当前时间为世纪分钟,提供扩展的夏令时信息,并包括幅度通道中没有的错误校正信息。

用法

Usage: python -m wwvb.gen [OPTIONS] [TIMESPEC]...

  Generate WWVB timecodes

  TIMESPEC: one of "year yday hour minute" or "year month day hour minute", or
  else the current minute

Options:
  -i, --iers / -I, --no-iers      Whether to use IESR data for DUT1 and LS.
                                  (Default: --iers)
  -s, --leap-second               Force a positive leap second at the end of
                                  the GMT month (Implies --no-iers)
  -n, --negative-leap-second      Force a negative leap second at the end of
                                  the GMT month (Implies --no-iers)
  -S, --no-leap-second            Force no leap second at the end of the month
                                  (Implies --no-iers)
  -d, --dut1 INTEGER              Force the DUT1 value (Implies --no-iers)
  -m, --minutes INTEGER           Number of minutes to show (default: 10)
  --style [bar|cradek|default|duration|json|sextant]
                                  Style of output
  -t, --all-timecodes / -T, --no-all-timecodes
                                  Show the 'WWVB timecode' line before each
                                  minute
  --channel [amplitude|phase|both]
                                  Modulation to show (default: amplitude)
  --help                          Show this message and exit.

例如,要显示1998年底发生的闰秒:

$ python wwvbgen.py -m 7 1998 365 23 56
WWVB timecode: year=98 days=365 hour=23 min=56 dst=0 ut1=-300 ly=0 ls=1
'98+365 23:56  210100110200100001120011001102010100010200110100121000001002
'98+365 23:57  210100111200100001120011001102010100010200110100121000001002
'98+365 23:58  210101000200100001120011001102010100010200110100121000001002
'98+365 23:59  2101010012001000011200110011020101000102001101001210000010022
'99+001 00:00  200000000200000000020000000002000100101201110100121001000002
'99+001 00:01  200000001200000000020000000002000100101201110100121001000002
'99+001 00:02  200000010200000000020000000002000100101201110100121001000002

(闰秒是23:59行末的额外数字;该分钟有61秒,而不是正常的60秒)

wwvbpy如何处理DUT1数据

wwvbpy在wwvb/iersdata_dist.pywwvb_iersdata.py中存储DUT1值的紧凑表示。在这种表示中,一个值对应一天(从0000UTC到2359UTC)。字母au代表-1.0秒到+1.0秒的偏移量,以0.1秒为增量;《code> k代表0秒。(在实践中,通常只看到较小的值范围,通常是-0.7秒到+0.8秒)

对于2001年至2019年,NIST已发布实际广播的DUT1值和每次更改的日期,尽管它是以HTML表格格式发布的,并不适合机器阅读。

https://www.nist.gov/pml/time-and-frequency-division/atomic-standards/leap-second-and-ut1-utc-information

NIST不每天更新值,也不遵循任何特定的舍入规则。而是在WWVB中,“DUT1校正的分辨率是0.1秒,代表一个较长日期范围的平均值。因此,它不会与之前表中显示的每周UT1-UTC(NIST)值完全一致,这些值具有1毫秒的分辨率,并每周更新。”就像wwvbpy对DUT1值的紧凑表示一样,真实的WWVB似乎从未广播过DUT1=-0.0。

对于跨越1973年至现在大约一年的更长时间范围,IERS发布历史和预期的UT1-UTC值,以多小数位数,采用机器可读的固定长度格式。

wwvbpy将WWVB和IERS数据集合并,当可用时优先选择WWVB数据集。这里有一些注意事项,这些注意事项主要在wwvb/updateiers.py脚本中注释。

wwvb/iersdata_dist.py每月从github actions更新,或者可以从wwvbpy源树中使用iersdata --dist更新。然而,目前并没有定期从更新的信息中发布版本。

可以创建或更新wwvb_iersdata.py的站点或用户版本,使用iersdata --siteiersdata --user。如果分发的iersdata已过时,生成器将提示您运行更新命令。

闰秒是从DUT1数据中推断出来的,如下所示:如果X和Y是连续日期的1位四舍五入的DUT1值,并且 X*Y<0,则在X日的末尾有一个闰秒。闰秒的方向可以从X的正负号推断出来,如果X为正,则是一个59秒的分钟,如果为负,则是一个61秒的分钟。只要DUT1在其它时间变化足够慢,且至少有一天DUT1=+0.0,就不会推断出错误的(负的)闰秒。(这种情况在未来几百年内应该仍然成立,直到一天的长度与86400秒相差100毫秒)

相位调制通道

与AM通道相比,这应该被视为更实验性的,因为测试仅覆盖了一个参考分钟。进一步的测试可以参考我所知的其他实现(链接),但该实现似乎不完整。

测试wwvbpy

使用gmake运行测试套件,检查覆盖率与类型注解。

有几个测试套件

  • testwwvb.py:检查输出与预期值是否一致。使用硬编码的闰秒。测试幅度和相位数据,尽管相位测试用例是可疑的,因为它们也是由wwvbpy生成的。
  • testuwwvb.py:测试具有较少功能的版本与主要版本之间的差异
  • testls.py:检查至2020年1月1日的IERS数据以期望的闰秒
  • testpm.py:检查相位调制数据与NIST文档中的一个测试用例
  • testcli.py:检查命令行程序是否按预期工作(限于测试以获得100%覆盖率)

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

wwvb-4.0.0.tar.gz (61.7 kB 查看哈希值)

上传时间

构建分布

wwvb-4.0.0-py3-none-any.whl (37.0 kB 查看哈希值)

上传时间 Python 3

由以下支持