Python用于简易烈度计系统运维

2017年11月05日 10:19来源于:科技创新与应用

python自动化运维记录

周蓝捷+方韓+李文惠

摘 要:文章是关于Python在地震监测服务器环境中的应用,使用Python及扩展包进行简易烈度计地震监测服务器运维监控、信息分析和发布。以常见的信息推送、延时统计、数据有效率统计、格式转换及简单数据分析过程提供了例程。

关键词:Python;简易烈度计;运维监控

中图分类号:P315.73 文献标志码:A 文章编号:2095-2945(2017)26-0151-02

1 概况

在福建省简易烈度计地震预警项目实施中,厦门地震勘测研究中心承担项目中简易烈度计站点的勘选、安装、组网建设等工作。在实施过程中,中心在Linux操作系统上,采用Earthworm技术系统搭建了简易烈度计数据处理平台。为了更好的监控系统运行状态,减轻值班人员工作量,采用Python语言编写了系统运行状态监控与信息发布程序。

Python是一门简单易学且功能强大的编程语言。它由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。Python简单易学,并具有跨平台特性,虽然运行效率不高,但并不成为瓶颈,不影响系统表现,但开发效率极高,能够帮助运维人员快速达成开发目标。

在开发的过程中,主要使用了Python中的Numpy、Matplotlib、Bsemap和Obspy等扩展包。

2 在烈度计系统运维中的应用

2.1 运维信息使用企业号推送

#定制并获取用户关心的内容content,通过企业号发送出去

#gettoken和senddata两个函数内容略,可直接复用

corpid = 'qiyehaoID'

corpsecret = 'qiyehaoMIYAO'

#获取token

accesstoken = gettoken(corpid,corpsecret)

#系统通知相关变量

user = '1|2|21|zlj|35|36|37|62|63|64|zsp'

#给user发送

contents=getcontent()

senddata(accesstoken,user,contents)

2.2 烈度计数据处理

2.2.1 OBSPY.EARTHWORM.CLIENT应用

#实时获取Earthworm服务器中台站数据当前的延时

from obspy.clients.earthworm import Client

from obspy import UTCDateTime

clientZ = Client("10.35.176.14", 16022, timeout=5)

t = UTCDateTime()

print("Process started at:", t)

responses =clientZ.get_availability(network="FJ")

delays=()

for response in responses:

delays += (response[1],response[5],t-response[5])

print('site:',response[1],'last received:',response[5],'delay is:',float(t-response[5]))

delayinseconds=delays[2::3]

delaymax=max(delayinseconds)

delaymin=min(delayinseconds)

print('current time is',t,'.processed',len(delays)/3,'sites.')

print('max delay of above is:',delaymax,'and min is:',delaymin)

2.2.2 OBSPY-SCAN應用

我们经常会有一堆数据,但是要处理的事件只是其中几分钟,我们想看看其中有哪些台站是可以用的,或者,我们想知道这段时间整个台网运行的情况。ObsPy提供了obspy-scan脚本可供使用。它在文件头中检数据文件格式(支持MiniSEED、SAC、SACXY、GSE2、SH-ASC、SH-Q、SEISAN等等),通过计算,以红色竖线绘制出断记,以小叉表示数据起始点,将整个数据文件的有效性直观的展现出来。这个脚本工具可以一次性扫描超过1000个文件(实际上已经在超过30000个文件的序列中运用过,计算持续时间45分钟)。它能够自动的将数据文件对应的年份月份绘制出来。对于绘制结果,我们还可以对关心的片段进行放大。

如下简单的一个指令即可进行数据文件扫描:

$obspy-scan /home/xmzk/357/*HLZ.mseed -o 357report.png

图1 obspy-scan的结果

2.2.3 波形按震中距排序分布图的绘制

以2016年10月31日16:26分广东梅州3.6级地震事件中,福建省漳州市境内128个简易烈度计的数据记录,做简单的震中距排序分布图为例:endprint

#在列表中查询台站经纬度,计算震中距,0.1-10Hz带通滤波,做震中距排序分布图

#关键部分代码

for sta in stas:

y,x=os.popen("grep "+sta+" /root/allstation | awk '{print $2,$3}'").read().split()

stZs.select(station=sta)[0].stats.stla=float(x)

stZs.select(station=sta)[0].stats.stlo=float(y)

for sts in stZs:

sts.stats.distance=gps2dist_azimuth(sts.stats.stla,sts.stats.stlo,eq_lat,eq_lon)[0]

Zstf=stZs.filter('bandpass',freqmin=0.1,freqmax=10)

Zstf.plot(type='section')

plt.savefig('/root/imgs/Z-section-'+et+'.png')

2.2.4 数据文件的抽取和格式的转换

#对给定的miniseed文件,抽取指定时间的数据片段,并转换为SAC格式

from obspy import read,Stream,UTCDateTime

import numpy as np

import os,datetime

pa=input("请输入数据文件完整路径,以'/'结束( eg. /home/xmzk/mseed/FJ/2016/305/,当前目录 ./ ):")

et=input("请输入有效起始UTC时刻,格式YYYYMMDD-HHMM( eg. 20161030-0826 ):")

drt=input("请输入需要取出的时间长度,单位整数秒( eg. 300 ):")

dt=UTCDateTime(datetime.datetime.strptime(et,'%Y%m%d-%H%M'))

stZs=read(pa+"*HLZ*.mseed",starttime=dt,endtime=dt+int(drt)).merge().sort()

for sts in stZs:

if hasattr(sts.data,'mask'):

sts.data=sts.data.filled(0)

for sts in stZs:

sts.write('./'+sts.id+'.SAC',format='SAC')

3 小結与展望

采用Python语言及相应的扩展包能够提高地震学项目的开发效率,能够减少在计算机编程语言方面的学习时间,成倍的提升数据处理工作效率,能够提供丰富的图形可视化结果,具有光明的前景,是值得学习并使用的高级计算机语言之一。

参考文献:

[1]Python Tutorial.http://www.pythondoc.com/pythontutorial3/index.html.

[2]TIOBE.http://www.tiobe.com/.

[3]Numpy.http://www.numpy.org/.

[4]Matplotlib.http://matplotlib.org/.

[5]Basemap.http://matplotlib.org/basemap/.

[6]ObsPy Tutorial.http://docs.obspy.org/tutorial/.endprint

 
免责声明:

     本文仅代表作者/企业观点,与【名品家电网】无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅供读者参考,并自行核实相关内容。

     【名品家电网】刊载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

      如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行;新闻纠错: lwl#youngchina.cn

关键词: 文章 光明 烈度