基金项目:北京市地震局面上项目:地震台网多维监控服务软件研制(BJMS-2021005);中国地震局地震科技星火计划攻关项目(XH200103)联合资助。
作者简介:马士振(1976-),男,高级工程师,主要从事地震监测工作。E-mail:13651367490@139.com
1.北京市地震局,北京 100080;2.广东省地震局,广州 510070;3.中国地震局地球物理研究所,北京100081;4.北京港震科技股份有限公司,北京 102628
1.Beijing Earthquake Agency , Beijing 100080, China;2.Guangdong Earthquake Agency , Guangzhou 510070, China;3.Institute of Geophysics , China Earthquake Administration , Beijing 100081, China;4.Beijing Geolight Technology Co.,Ltd.,Beijing 102628, China
DOI: 10.13512/j.hndz.2022.01.10
测震、强震、烈度仪台站24 h不间断运行,不断生产着观测数据。这些观测数据为后续各项工作,如地震速报、地震编目、烈度速报、地震预警等提供数据基础[1]。优质观测数据是开展科研工作诸多要素中的重要一环,有助于产出高质量的科研成果。在观测数据质量的多项评价指标中,数据的断计情况统计是一项重要的内容。这里的断计统计包含断计秒数和断计次数两项内容,断计秒数指统计时段内信号中断的秒数,断计次数指统计时段内数据中出现的中断次数①。通过断计秒数和断计次数这两项指标,可以对数据的完整性做出较直观的判断。
数字地震台网中心数据处理软件系统(以下简称JOPENS系统)[2]拥有丰富的配套软件。其中的人机交互MSDP软件提供了断计统计功能,统计结果包括统计时段内每日数据中断的秒数、统计时段内总的中断秒数、中断数据占比、连续数据占比。但是,使用MSDP完成断计统计需要手工设置断计统计时间段、存放目录等,通过MSDP实现自动化的断计统计存在一定困难。此外,运维人员获取断计统计结果的主要方法是主动使用软件进行查询,这样在查询结果的获取途径上会受到一定程度的约束,且查询结果的分发还需要再借助其他通信软件。
断计统计工作属于机械性的重复工作,如果可以每日自动完成数据的断计情况统计和信息发布将在一定程度上节约运维人员的工作时间。本文利用JOPENS6.1.2系统提供的HTTP数据传输协议②(实测可支持到 JOPENS6.1.8,以下简称JOPENS6)和obspy这个开源的Python库[3-5],实现了对台站观测数据自动化的断计统计工作,并通过企业微信实现统计结果的发布。
本文软件采用Python开发,实现了三个功能,一是通过HTTP数据传输协议从JOPENS6系统下载数据;二是使用obspy库的函数实现断计信息的获取;三是通过定时任务使数据下载、断计统计和企业微信发布自动化执行。
JOPENS6系统采用HTTP协议,统一在8080端口提供数据汇集与共享服务。下载数据的具体实现过程是:根据预置的条件,如台网代码、台站代码、通道代码、起止时间等,构建数据下载URL,然后使用Python的相关模块实现从JOPENS6系统下载miniseed格式数据。
为了统计断计信息,需要获取数据的实际起止时间。obspy是一个开源的Python库,拥有如数据读取、波形绘制、滤波、谱分析等丰富的功能,通过简单的函数调用即可实现对地震数据的处理。在本文中,主要使用了obspy的数据读取功能。obspy读入一个miniseed文件后,会将读入的数据看作一个流对象(stream),如果这段数据没有出现断计,那么这个流对象只有一个trace;如果出现了数据中断,那么这个流会包含多个trace。每一个trace都有开始和截止时间,将后一个trace的起始时间减去前一个trace的截止时间,即实现了断计时长的计算。多个断计时长累加在一起,就可以获得整段数据的中断时长。
为了实现自动化的数据下载、断计统计和企业微信发布,需要软件自动根据预设时间开展相关 工 作。本 文 采 用 了 Apscheduler 库(http://apscheduler.readthedocs.io/en/latest/)[6],它是Python的一个第三方库,实现了定时任务功能。
本文的软件即在Apscheduler的管理下,通过HTTP协议下载JOPENS6系统上的数据,然后使用obspy读取该数据,从而实现数据断计统计的功能。软件结构示意见图1。图中T2s指后一个trace的开始时间,T1e指前一个trace的结束时间。
JOPENS6产出数据的断计统计与信息发布需要多个模块的协作,主要包括数据下载模块、断计统计模块、企业微信发布模块和定时任务管理模块。
为了通过HTTP数据传输协议下载JOPENS6系统存储的观测数据,需要编写待下载数据的相关信息,并将此信息提交给系统,从而实现数据的下载。
图1 断计统计执行流程Fig.1 Flowchart of gap count
为了下载数据,本文使用了requests库。这是一个Python的第三方库,通过简单的方式即可实现对网络资源的访问。首先建立一个新的会话对象(session)
#导入requests库
import requests
j6Session = requests. Session()# 建立一个session对象
然后,构建一个字符串,该字符串包含JOPENS服务器的IP地址、端口号、台网代码、台站代码、数据起止时间。通过会话对象(seesion)将其提交给JOPENS6系统,系统会根据提交的信息返回相应观测数据。关键代码如下:
#构建下载信息字符串
cmd_download = ‘http://JOPENS6IP: 8080 /jopens-ws/app/aws/gwfw; net=BJ; sta=DAX; loc=00;cha=HHZ; beg=2021-01-01 01: 00: 00; end=2021-01-01 02:00:00’
resp = j6Session. get(cmd_download)# 获 取JOPENS6返回信息
with open(outfile_name,'wb')as f:#打开文件,以二进制形式写入
f.write(resp.content)#将数据写入文件
通过上述操作,即可将需要的观测数据下载到本地,并以二进制miniseed文件形式进行保存。
obspy库有一个内置的read函数,可读取多种格式的地震数据,读入的数据构成流(stream)对象。一个流对象可由一个或多个trace组成,每个trace都有起止时间,可以通过trace的函数获得。需要注意的是,trace的起止时间是UTC时间,为了更符合人们的工作习惯,需要把UTC格式的起止时间替换为北京时间。本文即根据trace的起止时间统计断计结果。流、trace起止时间的示意见图2,其中t1、t2、t3为断计时长。关键代码如下:
#导入dateutil模块和obpsy的read函数
import dateutil
from obspy import read
st=read(‘miniseed文件名’)#读取miniseed文件,构成名为st的流对象
trace1=st[0]#从流对象列表中取一个trace
#trace起止时间的获取
trace1_starttime = dateutil. parser. parse (str (trace1.stats.starttime))\ #提取开始时间
. astimezone(pytz. timezone('Asia/Shanghai'))\#转换为北京时间
.replace(tzinfo=None)#转换为不含时区的类型trace1_endtime=dateutil.parser.parse(str(trace1. stats.endtime))\
.astimezone(pytz.timezone('Asia/Shanghai'))\.replace(tzinfo=None)
若一个 stream 包含两个 trace,如 trace1 和trace2,根据以上代码分别获取各自的起止时间,而后将trace2的开始时间与trace1的结束时间相减,即可获得两者之间的断计时间,即
timedelta=trace2_starttime–trace1_endtime
timedelta.seconds#断计的秒数
timedelta.microseconds#断计的微秒数
注意,在统计断计时长时,还需要考虑第1个trace与miniseed文件标称开始时间之差,以及最后一个trace与miniseed文件标称结束时间之差。将这两个时间差与各trace间时间差相加起来,即可获得下载数据的总的断计时长。
至于断计次数,分为两种情况:若第1个trace的开始时间、最后一个trace的结束时间与下载数据时设置的起止时间一致,则:断计次数=trace总数-1。否则,断计次数=trace总数-1+(首或尾的断计次数)
通过上述计算,即可获得下载数据的断计时长和断计次数。将统计时段、断计时长、断计次数输出为csv格式的文件,以便于使用excel等工具进一步开展统计工作,如绘制统计图表,进而对断计分布情况做出分析。断计统计见图3。
图2 流(stream)对象与trace关系示意Fig.2 Diagram of relationship between stream and trace
图3 断计统计图Fig.3 Diagram of gap count
本文软件选用企业微信作为信息发布的媒介主要基于如下三个考虑,一是企业微信是腾讯公司针对企业开发的通信和办公工具,具有和微信一致的交流体验;二是企业微信中可以包括若干应用,各应用对谁可见由管理员根据需要进行控制;三是企业微信提供了开发接口,可以实现与开发者的软件对接,从而实现信息的发布、交互等。为了实现将断计统计结果自动发送给运维人员,本文软件的实现思路是:首先通过企业微信ID、应用的secret,获取接口调用凭证;其次,将统计结果文件提交到腾讯临时媒体库,并获得一个媒体ID;最后,向指定应用发送该媒体ID,从而实现了将文件发送到指定应用的目标。以下为关键代码:
corp_id="企业微信ID"
app_secret="应用的secret"
url = 'https://qyapi. weixin. qq. com / cgi-bin /gettoken?corpid={}&corpsecret={}'
#获取接口调用凭证
access_token = requests. get (url=url. format (corp_id,app_secret)).json().get ('access_token')
file_url='https://qyapi. weixin. qq. com/cgi-bin/media / upload? access_token= {}&type=file'. format (access_token)
#上传文件到临时媒体库
media_id=requests. post(file_url, files= {'file':open(‘文件绝对路径’,'rb')}).json ()['media_id']
send_file_url='https://qyapi. weixin. qq. com/cgi-bin / message / send? access_token= {}'. format (access_token)
send_values= {'touser':企业微信的用户名, 'msgtype': 'file', 'agentid': 应 用 的 ID, 'file':{'media_id':media_id},}
#将临时媒体库的文件发送到企业微信的应用
requests. post (url=send_file_url, data= json. dumps(send_values))
本文软件使用的定时任务模块为Apscheduler,在windows、linux上均可运行。通过设置任务的开始时间,即可实现周期性的定时任务。通过该模块,每日定时从JOPENS6服务器下载前一天的观测数据,并对其进行断计统计,最后将统计结果发送到企业微信。关键代码如下:
#导入Apscheduler相关模块
from apscheduler. schedulers. background import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger scheduler = BlockingScheduler()# 建立一个定时任务对象
trigger = CronTrigger(hour='1', minute='00') #设置定时任务的开始时间
#周期性执行routine函数,该函数是将前述的数据下载、断计统计整合在一起的函数
scheduler.add_job(routine,trigger,max_instances=10)
分别采用本文软件和MSDP(6.0版)对北京市测震台网连续7天的观测数据进行了断计统计,并对两者产出结果进行比较,详见表1。
表1 两种统计方法产出的断计秒数差异Table 1 The difference of output results between two statistical methods
在断计秒数方面,可以注意到大兴、密云、牛栏山、天坛、西集、斋堂等6个台站差值略大。经检查,注意到MSDP的断计结果中每小时的断计秒数均为整数。在与本文统计结果进行比较后,可以初步认为MSDP对有小数的断计秒数进行了向下取整操作。因此,对于上述6个台站,其断计统计结果的差值即来自被向下取整的小数之和。
为了统计高频中断次数统计的准确程度,本文使用三个断记次数在9000次左右的miniseed数据文件进行了测试。这三个数据文件是人为构建的,每个数据文件中每个trace时长不同,各trace间的间隔时长随机。数据文件构成后使用本文软件进行断记次数统计。统计结果显示,软件统计的断记次数与数据文件的实际断记次数一致,详见表2。
经测试,企业微信中“台站运行率”应用可以成功接收到本文软件发送的断计结果统计文件,并可正常显示文件内容,见图4。
表2 断记次数统计结果Table 2 The statistics of gap times
图4 企业微信接收到的文件及其内容Fig.4 Files and contents received by enterprise Wechat
通过本文的软件,可以实现在每天规定的时间,自动对监测台网全部台站观测数据以小时为单位进行断计秒数、断计次数统计,其统计结果与JOPENS6配套软件MSDP的结果基本一致。另外,通过企业微信的应用,实现了台站运行率结果的自动发布,有利于运维人员及时掌握台站运行率指标,尽快发现问题,解决问题,以尽可能提高有数据时段的占比,更好地为地震数据分析、地震科学研究提供服务。