ObsPy Tutorial
Handling Time
</div> </div> </div> image: User:Abbaszade656 / Wikimedia Commons / CC-BY-SA-4.0

Workshop for the "Training in Network Management Systems and Analytical Tools for Seismic"

Baku, October 2018

Seismo-Live: http://seismo-live.org

Authors:

This is a bit dry but not very difficult and important to know. It is used everywhere in ObsPy!

  • All absolute time values are consistently handled with this class.
  • Based on a nanosecond precision POSIX integer timestamp for accuracy.
  • Timezone can be specified at initialization (if necessary).
  • In Coordinated Universal Time (UTC) so no need to deal with timezones, daylight savings, ...

In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = 12, 8

Features of UTCDateTime

Initialization

In [2]:
from obspy import UTCDateTime

print(UTCDateTime("2014-08-24T10:20:44.0"))        # mostly time strings defined by ISO standard
print(UTCDateTime("2014-08-24T01:20:44.0-09:00"))  # non-UTC timezone input
print(UTCDateTime(2014, 8, 24, 10, 20, 44))        # year, month, day, hour, min, sec, musec
print(UTCDateTime(1408875644.0))                   # timestamp
2014-08-24T10:20:44.000000Z
2014-08-24T10:20:44.000000Z
2014-08-24T10:20:44.000000Z
2014-08-24T10:20:44.000000Z
In [3]:
# Current time can be initialized by leaving out any arguments
print(UTCDateTime())
2019-11-04T08:59:32.256536Z

Attribute Access

In [4]:
time = UTCDateTime("2014-08-24T10:20:44.0")
print(time.year)
print(time.julday)
print(time.timestamp)
print(time.weekday)
# try time.<Tab>
2014
236
1408875644.0
6

Handling time differences

  • "+/-" defined to add seconds to an UTCDateTime object
  • "-" defined to get time difference of two UTCDateTime objects
In [5]:
time = UTCDateTime("2014-08-24T10:20:44.0")
print(time)
2014-08-24T10:20:44.000000Z
In [6]:
# one hour later
print(time + 3600)
2014-08-24T11:20:44.000000Z
In [7]:
# Time differences
time2 = UTCDateTime(2015, 1, 1)
print(time2 - time)
11194756.0

Exercises

Calculate the number of days passed since the 2014 South Napa earthquake (the timestamp used above).

In [8]:
print((UTCDateTime() - UTCDateTime("2014-08-24T11:20:44.000000Z")) / 86400)
1897.901947792662

Make a list of 10 UTCDateTime objects, starting today at 10:00 with a spacing of 90 minutes.

In [9]:
t = UTCDateTime(2017, 9, 18, 10)

times = []
for i in range(10):
    t2 = t + i * 90 * 60
    times.append(t2)

times
Out[9]:
[2017-09-18T10:00:00.000000Z,
 2017-09-18T11:30:00.000000Z,
 2017-09-18T13:00:00.000000Z,
 2017-09-18T14:30:00.000000Z,
 2017-09-18T16:00:00.000000Z,
 2017-09-18T17:30:00.000000Z,
 2017-09-18T19:00:00.000000Z,
 2017-09-18T20:30:00.000000Z,
 2017-09-18T22:00:00.000000Z,
 2017-09-18T23:30:00.000000Z]

Below is a list of strings with origin times of magnitude 8+ earthquakes since 2000 (fetched from IRIS). Assemble a list of interevent times in days. Use matplotlib to display a histogram.

In [10]:
times = ["2000-11-16T04:54:56",
         "2001-06-23T20:33:09",
         "2003-09-25T19:50:07",
         "2004-12-23T14:59:00",
         "2004-12-26T00:58:52",
         "2005-03-28T16:09:35",
         "2006-05-03T15:26:39",
         "2006-06-01T18:57:02",
         "2006-06-05T00:50:31",
         "2006-11-15T11:14:14",
         "2007-01-13T04:23:23",
         "2007-04-01T20:39:56",
         "2007-08-15T23:40:58",
         "2007-09-12T11:10:26",
         "2009-09-29T17:48:11",
         "2010-02-27T06:34:13",
         "2011-03-11T05:46:23",
         "2012-04-11T08:38:37",
         "2012-04-11T10:43:10",
         "2013-05-24T05:44:49",
         "2014-04-01T23:46:47",
         "2015-09-16T22:54:32",
         "2017-09-08T04:49:21"]
In [11]:
import matplotlib.pyplot as plt

inter_event_times = []

for i in range(1, len(times)):
    dt = UTCDateTime(times[i]) - UTCDateTime(times[i-1])
    dt = dt / (3600 * 24)
    inter_event_times.append(dt)

plt.hist(inter_event_times, bins=range(0, 1000, 100))
plt.xlabel("Magnitude 8+ interevent times since 2000 [days]")
plt.ylabel("count")
plt.show()