GNSSCAL 使用文档

公历(格里高利历)是我们实际生活中使用的历法。但对于 GNSS 数据处理而言,其数据的观测日期通常以年、年积日的方式表示;而产品所对应的日期则常常以 GPS 周、周内日的方式表示。我们经常需要将日期在这几种表示方法之间切换。

本文将介绍一个 Python 库:gnsscal,它既可以作为模块导入,亦提供命令行操作方式。使用这个库可以方便快捷地查询公历、年积日和 GPS 周、BDS 周等对应的信息。

简介

gnsscal 是一个 Python 模块,该模块提供处理 GNSS 数据所需的日期的一些常量和函数。模块支持 Python 2 和 Python 3,代码托管在 Github 网站上。

安装与更新

gnsscal 支持使用 pip 进行安装,安装命令为:

1
$ pip install gnsscal

上面的命令将从 PyPI 仓库下载程序包,并将其加入到你的程序库中。要更新 gnsscal,可使用命令:

1
$ pip install --upgrade gnsscal

命令行模式

安装 gnsscal 之后,你可以通过命令行模式来使用它:

1
$ python -m gnsscal [options]

这里的 [options] 主要用于指定输入的日期,你可以使用如下参数:

  • -date <year> <month> <day>:通过年、月、日的方式指定输入的日期;
  • -ydoy <year> <doy>:通过年、年积日的方式指定输入的日期;
  • -gpswd <week> <dow>:通过 GPS 周、周内日的方式指定日期;
  • -bdswd <week> <dow>:通过 BDS 周、周内日的方式指定日期。
  • -v--version:显示程序版本信息;
  • -h--help:显示帮助信息。

示例,输入年、月、日,查看该日对应的年积日、GPS 周、BDS 周等信息:

1
$ python -m gnsscal -date 2017 9 25

输入年和年积日,查看对应的公历和 GPS 周、BDS 周等信息:

1
$ python -m gnsscal -ydoy 2017 268

输入 GPS 周和周内日,查看对应的信息:

1
$ python -m gnsscal -gpswd 1968 1

输入 BDS 周和周内日,查看对应的信息:

1
$ python -m gnsscal -bdswd 612 1

以上示例的输出都是相同的:

Gregorian date: 2017-09-25
year, doy: 2017, 268
GPS week: 1968, 1
BDS week: 0612, 1

作为模块

gnsscal 亦可以作为模块导入,这样你就可以使用其提供的函数库。目前,gnsscal 模块提供了两个常量和一系列的函数。你可以直接调用它们而不需要重新发明轮子。

常量

模块中定义的两个常量为:

  • GPS_START_DATE
    GPS 周计算的起点,该值是一个 datetime.date 型的常量,定义为 1980 年 1 月 6 日。

  • BDS_START_DATE
    BDS 周计算的起点,该值是一个 datetime.date 型的常量,定义为 2006 年 1 月 1 日。

作为示例的交互式控制台代码:

1
2
3
4
5
>>> from gnsscal import *
>>> GPS_START_DATE
datetime.date(1980, 1, 6)
>>> BDS_START_DATE
datetime.date(2006, 1, 1)

公历与年积日转换

  • date2doy(date)
    将公历转换为年积日,返回一个整数。

  • date2yrdoy(date)
    将公历转换为年和年积日,返回一个包含两个整数的元祖。

  • yrdoy2date(year, doy)
    将年和年积日转换为公历,返回一个 datetime.date 型的实例。

作为示例的交互式控制台代码:

1
2
3
4
5
6
7
8
>>> from datetime import date
>>> from gnsscal import *
>>> date2doy(date(2017, 5, 17))
137
>>> date2yrdoy(date(2017, 5, 17))
(2017, 137)
>>> yrdoy2date(2017, 137)
datetime.date(2017, 5, 17)

公历与 GPS/BDS 周转换

  • date2bdswd(date)
    将公历转换为 BDS 周和周内日,返回一个包含两个整数的元组。

  • date2gpswd(date)
    将公历转换为 GPS 周和周内日,返回一个包含两个整数的元组。

  • bdswd2date(bdsweek, dayofweek)
    将 BDS 周和周内日转换为公历,返回一个 datetime.date 型的实例。

  • gpswd2date(gpsweek, dayofweek)
    将 GPS 周和周内日转换为公历,返回一个 datetime.date 型的实例。

作为示例的交互式控制台代码:

1
2
3
4
5
6
7
8
9
10
>>> from datetime import date
>>> from gnsscal import *
>>> date2bdswd(date(2017, 5, 17))
(593, 3)
>>> date2gpswd(date(2017, 5, 17))
(1949, 3)
>>> bdswd2date(593, 3)
datetime.date(2017, 5, 17)
>>> gpswd2date(1949, 3)
datetime.date(2017, 5, 17)

年积日与 GPS/BDS 周转换

  • bdswd2yrdoy(bdsweek, dayofweek)
    将 BDS 周和周内日转换为年和年积日,返回一个包含两个整数的元组。

  • gpswd2yrdoy(gpsweek, dayofweek)
    将 GPS 周和周内日转换为年和年积日,返回一个包含两个整数的元组。

  • yrdoy2gpswd(year, doy)
    将年和年积日转换为 GPS 周和周内日,返回一个包含两个整数的元组。

  • yrdoy2bdswd(year, doy)
    将年和年积日转换为 BDS 周和周内日,返回一个包含两个整数的元组。

作为示例的交互式控制台代码:

1
2
3
4
5
6
7
8
9
>>> from gnsscal import *
>>> bdswd2yrdoy(593, 3)
(2017, 137)
>>> gpswd2yrdoy(1949, 3)
(2017, 137)
>>> yrdoy2gpswd(2017, 137)
(1949, 3)
>>> yrdoy2bdswd(2017, 137)
(593, 3)

BDS/GPS 周相互转换

  • bdsw2gpsw(bdsweek)
    将 BDS 周转换为 GPS 周,返回一个整数。

  • gpsw2bdsw(gpsweek)
    将 GPS 周转换为 BDS 周,返回一个整数。

作为示例的交互式控制台代码:

1
2
3
4
5
>>> from gnsscal import *
>>> bdsw2gpsw(593)
1949
>>> gpsw2bdsw(1949)
593

测试

如果你需要测试 gnsscal,其测试代码放在 test_gnsscal.py 中。你可以通过执行它来测试位于相同目录下的 gnsscal.py 程序:

1
$ python test_gnsscal.py

补充

如果你仅仅想要查看公历和年积日、GPS 周之间的相对应信息,访问 GNSS Calendar 网站也是一个不错的选择。从该网站还可以方便地下载 IGS 提供的产品。另外,如果你需要一个离线可用的 GUI 应用,也可以尝试一下本站下载页面所提供的 “GPS 日历”程序。