馬士振,林向東,蘇柱金,梁 芳,牟磊育,吳衛(wèi)遠
(1.北京市地震局,北京 100080;2.廣東省地震局,廣州 510070;3.中國地震局地球物理研究所,北京 100081;4.北京港震科技股份有限公司,北京 102628)
測震、強震、烈度儀臺站24 h 不間斷運行,不斷生產(chǎn)著觀測數(shù)據(jù)。這些觀測數(shù)據(jù)為后續(xù)各項工作,如地震速報、地震編目、烈度速報、地震預(yù)警等提供數(shù)據(jù)基礎(chǔ)[1]。優(yōu)質(zhì)觀測數(shù)據(jù)是開展科研工作諸多要素中的重要一環(huán),有助于產(chǎn)出高質(zhì)量的科研成果。在觀測數(shù)據(jù)質(zhì)量的多項評價指標(biāo)中,數(shù)據(jù)的斷計情況統(tǒng)計是一項重要的內(nèi)容。這里的斷計統(tǒng)計包含斷計秒數(shù)和斷計次數(shù)兩項內(nèi)容,斷計秒數(shù)指統(tǒng)計時段內(nèi)信號中斷的秒數(shù),斷計次數(shù)指統(tǒng)計時段內(nèi)數(shù)據(jù)中出現(xiàn)的中斷次數(shù)①廣東省地震監(jiān)測中心.數(shù)字中心數(shù)據(jù)處理軟件系統(tǒng)JOPENS6.0(區(qū)域臺網(wǎng)版)人機交互MSDP使用指南.廣州,2018.。通過斷計秒數(shù)和斷計次數(shù)這兩項指標(biāo),可以對數(shù)據(jù)的完整性做出較直觀的判斷。
數(shù)字地震臺網(wǎng)中心數(shù)據(jù)處理軟件系統(tǒng)(以下簡稱JOPENS 系統(tǒng))[2]擁有豐富的配套軟件。其中的人機交互MSDP 軟件提供了斷計統(tǒng)計功能,統(tǒng)計結(jié)果包括統(tǒng)計時段內(nèi)每日數(shù)據(jù)中斷的秒數(shù)、統(tǒng)計時段內(nèi)總的中斷秒數(shù)、中斷數(shù)據(jù)占比、連續(xù)數(shù)據(jù)占比。但是,使用MSDP 完成斷計統(tǒng)計需要手工設(shè)置斷計統(tǒng)計時間段、存放目錄等,通過MSDP 實現(xiàn)自動化的斷計統(tǒng)計存在一定困難。此外,運維人員獲取斷計統(tǒng)計結(jié)果的主要方法是主動使用軟件進行查詢,這樣在查詢結(jié)果的獲取途徑上會受到一定程度的約束,且查詢結(jié)果的分發(fā)還需要再借助其他通信軟件。
斷計統(tǒng)計工作屬于機械性的重復(fù)工作,如果可以每日自動完成數(shù)據(jù)的斷計情況統(tǒng)計和信息發(fā)布將在一定程度上節(jié)約運維人員的工作時間。本文利用JOPENS6.1.2 系統(tǒng)提供的HTTP 數(shù)據(jù)傳輸協(xié)議②廣東省地震監(jiān)測中心.數(shù)字中心數(shù)據(jù)處理軟件系統(tǒng)JOPENS6.0用戶手冊. 廣州,2017,(實測可支持到JOPENS6.1.8, 以下簡稱JOPENS6)和obspy 這個開源的Python 庫[3-5],實現(xiàn)了對臺站觀測數(shù)據(jù)自動化的斷計統(tǒng)計工作,并通過企業(yè)微信實現(xiàn)統(tǒng)計結(jié)果的發(fā)布。
本文軟件采用Python 開發(fā),實現(xiàn)了三個功能,一是通過HTTP 數(shù)據(jù)傳輸協(xié)議從JOPENS6系統(tǒng)下載數(shù)據(jù);二是使用obspy 庫的函數(shù)實現(xiàn)斷計信息的獲?。蝗峭ㄟ^定時任務(wù)使數(shù)據(jù)下載、斷計統(tǒng)計和企業(yè)微信發(fā)布自動化執(zhí)行。
JOPENS6 系統(tǒng)采用HTTP 協(xié)議,統(tǒng)一在8080端口提供數(shù)據(jù)匯集與共享服務(wù)。下載數(shù)據(jù)的具體實現(xiàn)過程是:根據(jù)預(yù)置的條件,如臺網(wǎng)代碼、臺站代碼、通道代碼、起止時間等,構(gòu)建數(shù)據(jù)下載URL,然后使用Python的相關(guān)模塊實現(xiàn)從JOPENS6系統(tǒng)下載miniseed格式數(shù)據(jù)。
為了統(tǒng)計斷計信息,需要獲取數(shù)據(jù)的實際起止時間。obspy 是一個開源的Python 庫,擁有如數(shù)據(jù)讀取、波形繪制、濾波、譜分析等豐富的功能,通過簡單的函數(shù)調(diào)用即可實現(xiàn)對地震數(shù)據(jù)的處理。在本文中,主要使用了obspy 的數(shù)據(jù)讀取功能。obspy 讀入一個miniseed 文件后,會將讀入的數(shù)據(jù)看作一個流對象(stream),如果這段數(shù)據(jù)沒有出現(xiàn)斷計,那么這個流對象只有一個trace;如果出現(xiàn)了數(shù)據(jù)中斷,那么這個流會包含多個trace。每一個trace 都有開始和截止時間,將后一個trace 的起始時間減去前一個trace 的截止時間,即實現(xiàn)了斷計時長的計算。多個斷計時長累加在一起,就可以獲得整段數(shù)據(jù)的中斷時長。
為了實現(xiàn)自動化的數(shù)據(jù)下載、斷計統(tǒng)計和企業(yè)微信發(fā)布,需要軟件自動根據(jù)預(yù)設(shè)時間開展相關(guān) 工 作。 本 文 采 用 了Apscheduler 庫(http://apscheduler.readthedocs.io/en/latest/)[6],它是Python的一個第三方庫,實現(xiàn)了定時任務(wù)功能。
本文的軟件即在Apscheduler 的管理下,通過HTTP 協(xié)議下載JOPENS6 系統(tǒng)上的數(shù)據(jù),然后使用obspy讀取該數(shù)據(jù),從而實現(xiàn)數(shù)據(jù)斷計統(tǒng)計的功能。軟件結(jié)構(gòu)示意見圖1。圖中T2s指后一個trace 的開始時間,T1e指前一個trace的結(jié)束時間。
圖1 斷計統(tǒng)計執(zhí)行流程Fig.1 Flowchart of gap count
JOPENS6 產(chǎn)出數(shù)據(jù)的斷計統(tǒng)計與信息發(fā)布需要多個模塊的協(xié)作,主要包括數(shù)據(jù)下載模塊、斷計統(tǒng)計模塊、企業(yè)微信發(fā)布模塊和定時任務(wù)管理模塊。
為了通過HTTP 數(shù)據(jù)傳輸協(xié)議下載JOPENS6 系統(tǒng)存儲的觀測數(shù)據(jù),需要編寫待下載數(shù)據(jù)的相關(guān)信息,并將此信息提交給系統(tǒng),從而實現(xiàn)數(shù)據(jù)的下載。
為了下載數(shù)據(jù),本文使用了requests 庫。這是一個Python的第三方庫,通過簡單的方式即可實現(xiàn)對網(wǎng)絡(luò)資源的訪問。首先建立一個新的會話對象(session)
#導(dǎo)入requests庫
import requests
j6Session = requests. Session()# 建 立 一個session對象
然后,構(gòu)建一個字符串,該字符串包含JOPENS 服務(wù)器的IP 地址、端口號、臺網(wǎng)代碼、臺站代碼、數(shù)據(jù)起止時間。通過會話對象(seesion)將其提交給JOPENS6 系統(tǒng),系統(tǒng)會根據(jù)提交的信息返回相應(yīng)觀測數(shù)據(jù)。關(guān)鍵代碼如下:
#構(gòu)建下載信息字符串
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)#將數(shù)據(jù)寫入文件
通過上述操作,即可將需要的觀測數(shù)據(jù)下載到本地,并以二進制miniseed文件形式進行保存。
obspy 庫有一個內(nèi)置的read 函數(shù),可讀取多種格式的地震數(shù)據(jù),讀入的數(shù)據(jù)構(gòu)成流(stream)對象。一個流對象可由一個或多個trace 組成,每個trace 都有起止時間,可以通過trace 的函數(shù)獲得。需要注意的是,trace 的起止時間是UTC 時間,為了更符合人們的工作習(xí)慣,需要把UTC 格式的起止時間替換為北京時間。本文即根據(jù)trace 的起止時間統(tǒng)計斷計結(jié)果。流、trace 起止時間的示意見圖2,其中t1、t2、t3為斷計時長。關(guān)鍵代碼如下:
圖2 流(stream)對象與trace關(guān)系示意Fig.2 Diagram of relationship between stream and trace
#導(dǎo)入dateutil模塊和obpsy的read函數(shù)
import dateutil
from obspy import read
st=read(‘miniseed 文件名’)#讀取miniseed文件,構(gòu)成名為st的流對象
trace1=st[0]#從流對象列表中取一個trace
#trace起止時間的獲取
trace1_starttime = dateutil. parser. parse(str
(trace1.stats.starttime)) #提取開始時間
.astimezone(pytz.timezone(′Asia/Shanghai′))#轉(zhuǎn)換為北京時間
.replace(tzinfo=None)#轉(zhuǎn)換為不含時區(qū)的類型
trace1_endtime=dateutil.parser.parse(str(trace1.stats.endtime))
.astimezone(pytz.timezone(′Asia/Shanghai′))
.replace(tzinfo=None)
若一個stream 包含兩個trace,如trace1 和trace2,根據(jù)以上代碼分別獲取各自的起止時間,而后將trace2的開始時間與trace1的結(jié)束時間相減,即可獲得兩者之間的斷計時間,即
timedelta=trace2_starttime-trace1_endtime
timedelta.seconds#斷計的秒數(shù)
timedelta.microseconds#斷計的微秒數(shù)
注意,在統(tǒng)計斷計時長時,還需要考慮第1個trace與miniseed 文件標(biāo)稱開始時間之差,以及最后一個trace與miniseed文件標(biāo)稱結(jié)束時間之差。將這兩個時間差與各trace 間時間差相加起來,即可獲得下載數(shù)據(jù)的總的斷計時長。
至于斷計次數(shù),分為兩種情況:若第1個trace的開始時間、最后一個trace 的結(jié)束時間與下載數(shù)據(jù)時設(shè)置的起止時間一致,則:斷計次數(shù)= trace總數(shù)-1。否則,斷計次數(shù)=trace 總數(shù)-1+(首或尾的斷計次數(shù))
通過上述計算,即可獲得下載數(shù)據(jù)的斷計時長和斷計次數(shù)。將統(tǒng)計時段、斷計時長、斷計次數(shù)輸出為csv格式的文件,以便于使用excel等工具進一步開展統(tǒng)計工作,如繪制統(tǒng)計圖表,進而對斷計分布情況做出分析。斷計統(tǒng)計見圖3。
圖3 斷計統(tǒng)計圖Fig.3 Diagram of gap count
本文軟件選用企業(yè)微信作為信息發(fā)布的媒介主要基于如下三個考慮,一是企業(yè)微信是騰訊公司針對企業(yè)開發(fā)的通信和辦公工具,具有和微信一致的交流體驗;二是企業(yè)微信中可以包括若干應(yīng)用,各應(yīng)用對誰可見由管理員根據(jù)需要進行控制;三是企業(yè)微信提供了開發(fā)接口,可以實現(xiàn)與開發(fā)者的軟件對接,從而實現(xiàn)信息的發(fā)布、交互等。為了實現(xiàn)將斷計統(tǒng)計結(jié)果自動發(fā)送給運維人員,本文軟件的實現(xiàn)思路是:首先通過企業(yè)微信ID、應(yīng)用的secret,獲取接口調(diào)用憑證;其次,將統(tǒng)計結(jié)果文件提交到騰訊臨時媒體庫,并獲得一個媒體ID;最后,向指定應(yīng)用發(fā)送該媒體ID,從而實現(xiàn)了將文件發(fā)送到指定應(yīng)用的目標(biāo)。以下為關(guān)鍵代碼:
corp_id='企業(yè)微信ID'
app_secret='應(yīng)用的secret'
url = ′https://qyapi. weixin. qq. com / cgi-bin /gettoken?corpid={}&corpsecret={}′
#獲取接口調(diào)用憑證
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/cgibin / message / send? access_token= {}′. format(access_token)
send_values = {′touser′:企業(yè)微信的用戶名,′msgtype′: ′file′, ′agentid′: 應(yīng) 用 的 ID,′file′:{′media_id′:media_id},}
#將臨時媒體庫的文件發(fā)送到企業(yè)微信的應(yīng)用requests. post(url=send_file_url, data= json.dumps(send_values))
本文軟件使用的定時任務(wù)模塊為Apscheduler,在windows、linux 上均可運行。通過設(shè)置任務(wù)的開始時間,即可實現(xiàn)周期性的定時任務(wù)。通過該模塊,每日定時從JOPENS6 服務(wù)器下載前一天的觀測數(shù)據(jù),并對其進行斷計統(tǒng)計,最后將統(tǒng)計結(jié)果發(fā)送到企業(yè)微信。關(guān)鍵代碼如下:
#導(dǎo)入Apscheduler相關(guān)模塊
from apscheduler.schedulers.background import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BlockingScheduler()# 建立一個定時任務(wù)對象
trigger = CronTrigger(hour=′1′,minute=′00′)
#設(shè)置定時任務(wù)的開始時間
#周期性執(zhí)行routine 函數(shù),該函數(shù)是將前述的數(shù)據(jù)下載、斷計統(tǒng)計整合在一起的函數(shù)
scheduler.add_job(routine,trigger,max_instances=10)
分別采用本文軟件和MSDP(6.0 版)對北京市測震臺網(wǎng)連續(xù)7天的觀測數(shù)據(jù)進行了斷計統(tǒng)計,并對兩者產(chǎn)出結(jié)果進行比較,詳見表1。
表1 兩種統(tǒng)計方法產(chǎn)出的斷計秒數(shù)差異Table 1 The difference of output results between two statistical methods
(接表1)
在斷計秒數(shù)方面,可以注意到大興、密云、牛欄山、天壇、西集、齋堂等6個臺站差值略大。經(jīng)檢查,注意到MSDP 的斷計結(jié)果中每小時的斷計秒數(shù)均為整數(shù)。在與本文統(tǒng)計結(jié)果進行比較后,可以初步認為MSDP 對有小數(shù)的斷計秒數(shù)進行了向下取整操作。因此,對于上述6個臺站,其斷計統(tǒng)計結(jié)果的差值即來自被向下取整的小數(shù)之和。
為了統(tǒng)計高頻中斷次數(shù)統(tǒng)計的準(zhǔn)確程度,本文使用三個斷記次數(shù)在9000 次左右的miniseed 數(shù)據(jù)文件進行了測試。這三個數(shù)據(jù)文件是人為構(gòu)建的,每個數(shù)據(jù)文件中每個trace 時長不同,各trace間的間隔時長隨機。數(shù)據(jù)文件構(gòu)成后使用本文軟件進行斷記次數(shù)統(tǒng)計。統(tǒng)計結(jié)果顯示,軟件統(tǒng)計的斷記次數(shù)與數(shù)據(jù)文件的實際斷記次數(shù)一致,詳見表2。
表2 斷記次數(shù)統(tǒng)計結(jié)果Table 2 The statistics of gap times
經(jīng)測試,企業(yè)微信中“臺站運行率”應(yīng)用可以成功接收到本文軟件發(fā)送的斷計結(jié)果統(tǒng)計文件,并可正常顯示文件內(nèi)容,見圖4。
圖4 企業(yè)微信接收到的文件及其內(nèi)容Fig.4 Files and contents received by enterprise Wechat
通過本文的軟件,可以實現(xiàn)在每天規(guī)定的時間,自動對監(jiān)測臺網(wǎng)全部臺站觀測數(shù)據(jù)以小時為單位進行斷計秒數(shù)、斷計次數(shù)統(tǒng)計,其統(tǒng)計結(jié)果與JOPENS6 配套軟件MSDP 的結(jié)果基本一致。另外,通過企業(yè)微信的應(yīng)用,實現(xiàn)了臺站運行率結(jié)果的自動發(fā)布,有利于運維人員及時掌握臺站運行率指標(biāo),盡快發(fā)現(xiàn)問題,解決問題,以盡可能提高有數(shù)據(jù)時段的占比,更好地為地震數(shù)據(jù)分析、地震科學(xué)研究提供服務(wù)。