diff --git a/src/python/geomag/io/iaga2002/IAGA2002Factory.py b/src/python/geomag/io/iaga2002/IAGA2002Factory.py
index 120d9c8270ef235386bb0cf58504cfb067514dcc..1d8f9dcb2f8da5631e30f07579a56cb7c6bd972f 100644
--- a/src/python/geomag/io/iaga2002/IAGA2002Factory.py
+++ b/src/python/geomag/io/iaga2002/IAGA2002Factory.py
@@ -120,8 +120,8 @@ class IAGA2002Factory(TimeseriesFactory):
         headers = parser.headers
         station = headers['IAGA CODE']
         comments = tuple(parser.comments)
-        starttime = parser.times[0]
-        endtime = parser.times[-1]
+        starttime = obspy.core.UTCDateTime(parser.times[0])
+        endtime = obspy.core.UTCDateTime(parser.times[-1])
         data = parser.data
         length = len(data[data.keys()[0]])
         rate = (length - 1) / (endtime - starttime)
diff --git a/src/python/geomag/io/iaga2002/IAGA2002Parser.py b/src/python/geomag/io/iaga2002/IAGA2002Parser.py
index 30967632fe0b4ec876691afa5037dac81c9d3a0d..2125ffe80f795f81b28f532444daf07f36558171 100644
--- a/src/python/geomag/io/iaga2002/IAGA2002Parser.py
+++ b/src/python/geomag/io/iaga2002/IAGA2002Parser.py
@@ -2,9 +2,7 @@
 
 
 import numpy
-from obspy.core.utcdatetime import UTCDateTime
-from geomag.io import Timeseries
-
+from datetime import datetime
 
 # values that represent missing data points in IAGA2002
 EIGHTS = numpy.float64('88888.88')
@@ -41,10 +39,12 @@ class IAGA2002Parser(object):
         self.comments = []
         # array of channel names
         self.channels = []
-        # timestamps of data (obspy.core.utcdatetime.UTCDateTime)
+        # timestamps of data (datetime.datetime)
         self.times = []
         # dictionary of data (channel : numpy.array<float64>)
         self.data = {}
+        # temporary storage for data being parsed
+        self._parsedata = None
 
     def parse(self, data):
         """Parse a string containing IAGA2002 formatted data.
@@ -98,9 +98,8 @@ class IAGA2002Parser(object):
         self.channels.append(line[40:50].strip().replace(iaga_code, ''))
         self.channels.append(line[50:60].strip().replace(iaga_code, ''))
         self.channels.append(line[60:69].strip().replace(iaga_code, ''))
-        # create data arrays
-        for channel in self.channels:
-            self.data[channel] = []
+        # create parsing data arrays
+        self._parsedata = ([], [], [], [], [])
 
     def _parse_data(self, line):
         """Parse one data point in the timeseries.
@@ -108,12 +107,20 @@ class IAGA2002Parser(object):
         Adds time to ``self.times``.
         Adds channel values to ``self.data``.
         """
-        channels = self.channels
-        self.times.append(UTCDateTime(line[0:24]))
-        self.data[channels[0]].append(line[31:40].strip())
-        self.data[channels[1]].append(line[41:50].strip())
-        self.data[channels[2]].append(line[51:60].strip())
-        self.data[channels[3]].append(line[61:70].strip())
+        # parsing time components is much faster
+        time = datetime(
+                # date
+                int(line[0:4]), int(line[5:7]), int(line[8:10]),
+                # time
+                int(line[11:13]), int(line[14:16]), int(line[17:19]),
+                # microseconds
+                int(line[20:23]) * 1000)
+        t, d1, d2, d3, d4 = self._parsedata
+        t.append(time)
+        d1.append(line[31:40])
+        d2.append(line[41:50])
+        d3.append(line[51:60])
+        d4.append(line[61:70])
 
     def _post_process(self):
         """Post processing after data is parsed.
@@ -125,12 +132,14 @@ class IAGA2002Parser(object):
         """
         self.comments = self._merge_comments(self.comments)
         self.parse_comments()
-        for channel in self.data:
-            data = numpy.array(self.data[channel], dtype=numpy.float64)
+        self.times = self._parsedata[0]
+        for channel, data in zip(self.channels, self._parsedata[1:]):
+            data = numpy.array(data, dtype=numpy.float64)
             # filter empty values
             data[data == EIGHTS] = numpy.nan
             data[data == NINES] = numpy.nan
             self.data[channel] = data
+        self._parsedata = None
 
     def parse_comments(self):
         """Parse header values embedded in comments."""