Reading miniSEED data with Python 3

UPDATE 29.03.2015: ObsPy, начиная с версии 0.10.1 поддерживает Python 3. Так что изобретать велосипед больше нет необходимости.

Мне часто приходится работать с данными, сохраненными в распространенном, в основном, среди сейсмологов формате miniSEED. miniSEED (урезанный SEED) – это международный формат для обмена цифровыми сейсмологическими данными. В роли данных как правило выступают записи виброускорений, виброскорости или виброперемещения земной коры, зданий и сооружений. Не так давно я начал процесс миграции с MATLAB, как основного инструмента разработки прикладных программ для исследовательских изысканий, на язык программирования Python 3 совместно с модулями NumPy и SciPy. К сожалению, на просторах Интернета я не нашел подходящего готового модуля для работы с miniSEED на Python 3 и придумал следующее решение проблемы.

В настоящее время развитие формата находится под контролем организации с непереводимым названием Федерация Цифровых Сейсмических Станций (http://www.fdsn.org/). Описание формата приведено в громадном документе. Желающие могут ознакомиться по диагонали.

Для семейства Python 2 существует отличный фреймворк ObsPy. Изучив исходный код модуля obspy.mseed, было решено попытаться портировать его на Python 3. Портирована далеко не вся функциональность  оригинального модуля – лишь та, которая мне нужна в работе – чтение miniSEED-файлов. Как и оригинальный модуль, портированный также основан на использовании C-шной библиотеки libmseed. В состав модуля включены скомпилированные библиотеки libmseed.dll для 32- и 64-битных платформ Windows.

“Батарейки в комплект входят”. Всё что нужно для использования модуля – это распаковать его в директорию, находящуюся  на пути поиска Python.  Модуль протестирован на куче SEED-файлов из разных источников. К сожалению, гарантировать корректную работу модуля могу только на Windows, с файлами, генерируемыми приборами компании GeoSIG. Для работы на Linux потребуется скомпилировать библиотеку libmseed под вашу платформу и изменить пару строчек кода в файле headers.py

Повторюсь, что у меня не было цели скопировать всю функциональность ObsPy. Хотелось получить компактный модуль для работы с miniSEED c минимальным количеством зависимостей от сторонних пакетов. Кроме собственно Python 3 (>3.1) для работы с модулем понадобится только стандартная связка NumPy, SciPy и matplotlib.

Использование модуля:

#Импортируем модуль
import mseed.mseed as MSEED
#Полный путь к обрабатываемому файлу данных
filename='C:\Work\example.msd'

Пакет содержит функции:

#Проверяем является ли filename
#валидным SEED-файлом
status=MSEED.isMSEED(filename)
#Возвращает True или False

Основная функция, ради которой всё и затевалось:

#Чтение файла
data=MSEED.readMSEED(filename)

Функция возвращает список списков(для каждого канала) с заголовочным словарём и массивом данных типа ndarray:

>>>[[{‘channel’: b’HNE’, ‘dataquality’: b’D’, ‘endtime’: 1337669913560000, ‘location’: b’X_’, ‘network’: b’NQ’, ‘numsamples’: 120000, ‘samplecnt’: 120000, ‘sampletype’: b’i’, ‘samprate’: 200.0, ‘starttime’: 1337669313565000, ‘station’: b’983′}, array([13596, 14030, 11469, …, 9748, 7806, 7889], dtype=int32)], [{‘channel’: b’HNN’, ‘dataquality’: b’D’, ‘endtime’: 1337669913560000, ‘location’: b’Y_’, ‘network’: b’NQ’, ‘numsamples’: 120000, ‘samplecnt’: 120000, ‘sampletype’: b’i’, ‘samprate’: 200.0, ‘starttime’: 1337669313565000, ‘station’: b’983′}, array([19987, 20386, 17966, …, 17237, 17163, 18453], dtype=int32)], [{‘channel’: b’HNZ’, ‘dataquality’: b’D’, ‘endtime’: 1337669913560000, ‘location’: b’Z_’, ‘network’: b’NQ’, ‘numsamples’: 120000, ‘samplecnt’: 120000, ‘sampletype’: b’i’, ‘samprate’: 200.0, ‘starttime’: 1337669313565000, ‘station’: b’983′}, array([29100, 29877, 30991, …, 33727, 34972, 32188], dtype=int32)]]

Доступна функция, которая производит лишь чтение заголовков, без чтения массива данных:

#Чтение заголовков файла
header=MSEED.readHeaderOnly(filename)

Для получения времени начала и конца записи массива данных используется следующая функция:

#Получаем время начала и конца записи данных
StartAndEndTime=MSEED.getStartAndEndTime(filename)

Функция возвратит кортеж, содержащий два экземпляра класса UTCDateTime из пакета ObsPy:

>>>(UTCDateTime(2012, 5, 22, 6, 49, 34, 202000), UTCDateTime(2012, 5, 22, 6, 58, 33, 560000))

Не беспокойтесь, описание класса я внедрил в пакет mseed, предварительно внеся в него ряд изменений для поддержки Python 3. Класс допускает конвертацию даты/времени в нативный питоновский формат datetime. Класс UTCDateTime хорошо документирован. См. файл UTCDateTime.py Последняя полезная функция выводит графики данных (все доступные каналы):

MSEED.plotTraces(filename)

miniseed_traces_plot Модуль mseed можно скачать по ссылке.

Это один из первых моих опытов общения с Python. Прошу не судить строго, но указывать на ошибки.

(2179 просмотров)

Leave a Reply

Your email address will not be published. Required fields are marked *