Index: sodar/trunk/sodar/data.py =================================================================== --- sodar/trunk/sodar/data.py (revision 66) +++ sodar/trunk/sodar/data.py (revision 67) @@ -111,5 +111,5 @@ """Clean up data for analysis.""" self._copy() - # self._convert() + self._convert() # compute time interval # correct for missing times @@ -127,22 +127,18 @@ def _copy(self): - """Create a deep copy of all the samples in this Data instance.""" - self.samples = [(dict(sample.header), list(sample.body)) - for sample in self] - for sample in self.samples: - for altitude in sample[1]: - altitude = dict(altitude) + """Create a deep copy as a list of Sample copies.""" + self.samples = [sample._copy() for sample in self] def _convert(self): """Convert to numbers and correct for invalid values.""" INVALID = "-9999" - # convert to numbers and correct for invalid values for sample in self.samples: - for altitude in sample[1]: - for key in altitude.keys(): + body = sample[1] + for altitude in body: + for key,value in altitude.items(): try: - if altitude[key] == INVALID: + if value == INVALID: raise ValueError - altitude[key] = float(altitude[key]) + altitude[key] = float(value) except (ValueError, TypeError, KeyError): altitude[key] = n.NaN @@ -171,5 +167,5 @@ if self.body is not None: self.body = Body(self.body) - + def __getitem__(self, index): """Index Sample by body attribute.""" @@ -178,4 +174,8 @@ except TypeError: # sample.body may not exist raise IndexError('Sample index out of range') + + def _copy(self): + """Create a deep copy as a tuple of header and body copies.""" + return (self.header._copy(), self.body._copy()) @@ -202,5 +202,9 @@ self.update(dict(zip(" ".join(headerLines[::2]).split(), " ".join(headerLines[1::2]).split()))) - + + def _copy(self): + """Create a shallow copy as a dictionary.""" + return self.copy() + class Body(list): @@ -239,8 +243,15 @@ def _find(self, index): """Find altitude data in Body.""" - for altitudeData in self: - if altitudeData['ALT'] != index: continue - return altitudeData + for altitude in self: + try: + if altitude['ALT'] != index: continue + except KeyError: + continue + return altitude raise IndexError('Body index, out of range') + + def _copy(self): + """Create a deep copy as a list of dictionaries.""" + return [altitude.copy() for altitude in self]