obspy中文教程(一)

原文链接: https://blog.csdn.net/dodwind/article/details/81085749

说明:

obspy是一个针对地震领域开发的python库。其目的是使地震学软件包和工作流程的发展更为便利,也利用这些功能为地震学进入更大的科学python生态系统建桥铺路。obspy对地震学界内通常使用的几乎所有文件格式提供读写支持,它取代了大量的文件格式转换工具;在这样广泛的输入/输出支持的基础上,在处理程序时使用地震学家之间交流的专业术语。obspy整合了获取世界范围内地震数据中心所发布数据的方法,集成了大量地震学界所用的专有库,并且使用一个简单易用的接口统一调用所有功能。

Python高效便捷易懂的特点,基于其开发的obspy也非常容易理解使用,是一个很好的帮助科研的软件工具。由于最近选修了David A Yuen教授的暑期课程《大数据理论基础及其在地球科学中的应用》,需要有一篇合适的课程报告,又为了方便广大同行学者和爱好者参考,这里将obspy官网的(http://docs.obspy.org/)的教程翻译为中文文档(英文教程链接:http://docs.obspy.org/tutorial/index.html)。受个人学识所限,翻译教程中的错误和不当还请谅解和指正。

联系邮箱:[email protected]

 

由于篇幅过长,一共分为八个文档,此为第一部分,内容如下目录:

目录

UTCDateTime(世界标准时间数据)

Reading Seismograms(读取地震数据)

Waveform Plotting Tutorial(波形绘制)

Retrieving Data from Data Centers(从数据中心检索数据)

Filtering Seismograms(滤波)


 

UTCDateTime(世界标准时间数据)

ObsPy中的所有绝对时间值均由UTCDateTime类一致处理。因为精度问题它基于高精度POSIX时间戳,而不是Python datetime类。

初始化: 

>>> from obspy.core import UTCDateTime

>>> UTCDateTime("2012-09-07T12:15:00")

UTCDateTime(2012, 9, 7, 12, 15)

>>> UTCDateTime(2012, 9, 7, 12, 15, 0)

UTCDateTime(2012, 9, 7, 12, 15)

>>> UTCDateTime(1347020100.0)

UTCDateTime(2012, 9, 7, 12, 15)

多数情况下不需要担心时区问题,但是支持以下格式:

>>> UTCDateTime("2012-09-07T12:15:00+02:00")

UTCDateTime(2012, 9, 7, 10, 15)

属性访问

>>> time = UTCDateTime("2012-09-07T12:15:00")

>>> time.year

2012

>>> time.julday

251

>>> time.timestamp

1347020100.0

>>> time.weekday

4

处理时间差

>>> time = UTCDateTime("2012-09-07T12:15:00")

>>> print(time + 3600)

2012-09-07T13:15:00.000000Z

>>> time2 = UTCDateTime(2012, 1, 1)

>>> print(time - time2)

21644100.0

Reading Seismograms(读取地震数据)

obspy可以将各种格式的地震数据(例如SAC,MiniSEED,GSE2,SEISAN,Q等)使用read()函数的对象导入到Stream对象中。

Stream类似一个包含多个Trace对象(例如无间隙连续时间序列和相关的对象头/元信息)的列表。

每个Trace对象都有一个名为data的属性,对应实际时间序列的NumPy ndarray,以及stats属性。(Stats对象是一个包含所有元信息的字典。)Stats中的starttime和endtime也都是UTCDateTime对象。

以下示例演示如何将单个GSE2格式的地震图文件读入ObsPy Stream中。 在给定的地震记录中只有一个Trace:

>>> from obspy import read

>>> st = read('http://examples.obspy.org/RJOB_061005_072159.ehz.new')

>>> print(st)

1 Trace(s) in Stream:

.RJOB..Z | 2005-10-06T07:21:59.849998Z - 2005-10-06T07:24:59.844998Z | 200.0 Hz, 36000 samples

>>> len(st)

1

>>> tr = st[0] # assign first and only trace to new variable

>>> print(tr)

.RJOB..Z | 2005-10-06T07:21:59.849998Z - 2005-10-06T07:24:59.844998Z | 200.0 Hz, 36000 samples

 

访问元信息

在每个Trace中可通过stats关键词对地震元数据(描述实际波形数据的数据)进行访问:

>>> print(tr.stats)

network:

station: RJOB

location:

channel: Z

starttime: 2005-10-06T07:21:59.849998Z

endtime: 2005-10-06T07:24:59.844998Z

sampling_rate: 200.0

delta: 0.005

npts: 36000

calib: 0.0948999971151

_format: GSE2

gse2: AttribDict({’instype’: ’ ’, ’datatype’: ’CM6’, ’hang’: -1.0, ’auxid’

>>> tr.stats.station

’RJOB’

>>> tr.stats.gse2.datatype

’CM6’

 

访问波形数据

在每个Trace中可以通过data关键词对实际波形数据进行检索:

>>> tr.data

array([-38, 12, -4, ..., -14, -3, -9])

>>> tr.data[0:3]

array([-38, 12, -4])

>>> len(tr)

36000

 

数据浏览

Stream对象提供了一个用于快速预览波形的plot()方法(需要obspy.imaging模块):

>>> st.plot()

 

Waveform Plotting Tutorial(波形绘制)

该教程中我们使用两个不同的obspy Stream对象:一个是只包含一个Trace的singlechannel,另一个是包含三分量波形数据的threechannel

>>> from obspy.core import read

>>> singlechannel = read(’https://examples.obspy.org/COP.BHZ.DK.2009.050’)

>>> print(singlechannel)

1 Trace(s) in Stream:

DK.COP..BHZ | 2009-02-19T00:00:00.025100Z - 2009-02-19T23:59:59.975100Z | 20.0 Hz, 1728000 samples

>>> threechannels = read(’https://examples.obspy.org/COP.BHE.DK.2009.050’)

>>> threechannels += read(’https://examples.obspy.org/COP.BHN.DK.2009.050’)

>>> threechannels += read(’https://examples.obspy.org/COP.BHZ.DK.2009.050’)

>>> print(threechannels)

3 Trace(s) in Stream:

DK.COP..BHE | 2009-02-19T00:00:00.035100Z - 2009-02-19T23:59:59.985100Z | 20.0 Hz, 1728000 samples

DK.COP..BHN | 2009-02-19T00:00:00.025100Z - 2009-02-19T23:59:59.975100Z | 20.0 Hz, 1728000 samples

DK.COP..BHZ | 2009-02-19T00:00:00.025100Z - 2009-02-19T23:59:59.975100Z | 20.0 Hz, 1728000 samples

 

基本绘制

使用Stream对象中的plot()方法显示图示。该图像的默认大小为800*250像素。可使用size属性调整其大小。

>>> singlechannel.plot()

 

自定义绘制

下例展示了如何调整图像颜色、坐标刻度值、格式、角度以及显示出的开始和结束时间。所有参数的设置可参考plot()方法的介绍文档。

>>> dt =singlechannel[0].stats.starttime

>>>.plot(color=’red’, number_of_ticks=7,

...          tick_rotation=5, tick_format=’%I:%M %p’,

...          starttime=dt + 60*60, endtime=dt + 60*60 + 120)

 

保存图像

图像可以通过outfile参数保存到文件系统中。文件格式通过文件后缀自动识别,例如:png、pdf、ps、eps和svg。

>>> singlechannel.plot(outfile=’singlechannel.png’)

 

绘制多通道图形

如果Stream对象中包含多个Trace,每个Trace都可以在同一个窗口中复合显示。每个Trace的开始和结束时间保持一致,且y轴的范围相等。每附加一条图像都会使结果增高250像素。下例中通过使用size属性设置整幅图像大小。

>>> threechannels.plot(size=(800, 600))

 

创建One-Day图像

一天的Trace图像可以通过设置type参数“dayplot”进行显示:

>>> singlechannel.plot(type=’dayplot’)

事件信息同样可以包含在图示中(实验性功能,版本可能会改变)。

>>> from obspy import read

>>> st = read("https://examples.obspy.org/GR.BFO..LHZ.2012.108")

>>> st.filter("lowpass", freq=0.1, corners=2)

>>> st.plot(type="dayplot", interval=60, right_vertical_labels=False,

... vertical_scaling_range=5e3, one_tick_per_line=True,

... color=[’k’, ’r’, ’b’, ’g’], show_y_UTC_label=False,

... events={’min_magnitude’: 6.5})

 

绘制一段记录

绘制Stream中的某一段记录可以通过设置type参数为“section”:

>>> stream.plot(type=’section’)

Obspy头trace.stats.distance(offset)单位必须为米,或者地理位置trace.stats.coordinates.latitude & trace.stats.coordinates.longitude 必须有定义(如果该部分与参数ev_coord一起以圆距离绘制(dist_degree = True))。更多信息参考plot()。

 

绘图和颜色选项

调整一些参数可以改变波形图的外观。所有可调选项参考plot()方法。

 

使用Matplotlib自定义绘图

就像下面这个简约的例子所示,使用matplotlib可以进行自定义绘制:

import matplotlib.pyplot as plt

from obspy import read

st = read()

tr = st[0]

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.plot(tr.times("matplotlib"), tr.data, "b-")

ax.xaxis_date()

fig.autofmt_xdate()

plt.show()

Retrieving Data from Data Centers(从数据中心检索数据)

PS:此部分提供了使用obspy下载数据的推荐方式,但是由于数据中心和web服务在不断更新变化,所有有些建议可能变无效。

Note:最常见的应用为下载波形和整个或部分事件元信息。多数情况下你都可以用到obspy.clients.fdsn模块。它支持最大数量的数据集并使用最新的数据格式。虽然可以选择不同的模块,但是请确保你至少有一个可用模块。

 

FDSN网络服务

基础FDSN网络服务

Table 1

可用数据类型:

格式:

Waveforms

Station Information

Event Information

MiniSEED and optionally others

StationXML and Text

QuakeML and Text

 

Note:并不是所有数据都有这三种数据格式,很多只提供一或两种。

 

如果想访问数据或者事件元信息,你很有可能会使用到obspy.clients.fdsn模块。它可以从任何一个部署了FDSN网络的数据中心访问请求数据服务。示例数据中心包含IRIS/ORFEUS/INGV/ETH/GFZ/RESIF/...。一个突出的优势是其返回的数据使用最新的并可用于未来的数据格式。

FDSN Routing网络服务

如果你不清楚某个数据中心有哪些数据,你可以使用Obspy支持的以下两种routing 服务中的一种:.

1.The IRIS Federator.

2. The EIDAWS Routing Service.

更多使用细节可以参考obspy.clients.fdsn模块的说明。

FDSN 下载器:

如果你需要从一些数据中心下载大量的数据,obspy提供了Mass downloader。例如,您可以根据地理区域制定查询,ObsPy将下载波形和相应的站点元信息,并生成完整的有基本质量控制的数据集以供研究使用。

 

ArcLink

Table 2

可用数据类型:

格式:

Waveforms

Station Information

MiniSEED ,SEED

Dataless SEED,SEED

ArcLink是一种分布式数据请求协议,可用于访问MiniSEED和SEED格式的波形数据并关联元信息到无数据的SEED文件。你可以使用obspy.clients.arclink模型从EIDA访问数据,同时也可以使用obspy.clients.fdsn模块进行访问。

 

IRIS网络服务

IRIS网络服务包含各种数据类型和格式。IRIS(作为FDSN网络服务的补充)提供各种专用Web服务。Obspy在obspy.clients.iris模块中提供了一些接口,如果您需要SAC极点和零点或RESP格式的响应信息,请使用此选项。 如果您只关心仪器响应,请使用obspy.clients.fdsn模块来请求包含相同信息的StationXML数据。

Table 3

IRIS 网络服务

等同的obspy模块

obspy.clients.iris.client.Client.traveltime()

obspy.clients.iris.client.Client.distaz()

obspy.clients.iris.client.Client.flinnengdahl()

obspy.taup

obspy.geodetics

obspy.geodetics.flinengdahl.FlinnEngdahl

 

Earthworm Wave 服务

Table 4

可用数据类型:

格式:

Waveforms

Custom Format

使用obspy.clients.earthworm模块访问Earthmorm系统的数据。

 

NERIES网络服务

建议使用obspy.clients.fdsn模块进行访问

 

NEIC

Table 5

可用数据类型:

格式:

Waveforms

MiniSEED

连续波形数据(CWB)是一个针对由NEIC“Edge”系统处理的地震波形数据的存储库。使用obspy.clients.neic模块向其请求数据。

 

Syngine服务

Table 6

可用数据类型:

格式:

Waveforms

MiniSEED and zipped SAC files

模块:obspy.clients.syngine

 

Filtering Seismograms(滤波)

以下脚本展示了如何对一个地震记录进行滤波。示例使用一个零相移低通(1Hz)滤波器处理波形。

可用的滤波器有:带通,带阻,低通,高通

import numpy as np

import matplotlib.pyplot as plt

import obspy

# Read the seismogram

st = obspy.read("https://examples.obspy.org/RJOB_061005_072159.ehz.new")

# There is only one trace in the Stream object, let’s work on that trace...

tr = st[0]

# Filtering with a lowpass on a copy of the original Trace

tr_filt = tr.copy()

tr_filt.filter(’lowpass’, freq=1.0, corners=2, zerophase=True)

# Now let’s plot the raw and filtered data...

t = np.arange(0, tr.stats.npts / tr.stats.sampling_rate, tr.stats.delta)

plt.subplot(211)

plt.plot(t, tr.data, ’k’)

plt.ylabel(’Raw Data’)

plt.subplot(212)

plt.plot(t, tr_filt.data, ’k’)

plt.ylabel(’Lowpassed Data’)

plt.xlabel(’Time [s]’)

plt.suptitle(tr.stats.starttime)

plt.show()

你可能感兴趣的:(obspy中文教程(一))