~pythonxy/pythonxy-upstream/python-pandas

« back to all changes in this revision

Viewing changes to pandas/io/parsers.py

  • Committer: Wes McKinney
  • Date: 2009-08-05 03:30:16 UTC
  • Revision ID: git-v1:c6b236db73ff81007909be6406f0e484edc4a9eb
first commit with cleaned up code

git-svn-id: http://pandas.googlecode.com/svn/trunk@5 d5231056-7de3-11de-ac95-d976489f1ece

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""
 
2
Module contains tools for processing files into DataFrames or other objects
 
3
"""
 
4
 
 
5
from pandas.core.index import Index
 
6
from pandas.core.frame import DataFrame
 
7
from pandas.core.matrix import DataMatrix
 
8
from pandas.core.series import Series
 
9
 
 
10
from datetime import datetime, timedelta
 
11
 
 
12
try:
 
13
    from dateutil import parser
 
14
except ImportError:
 
15
    # just a little hack for now
 
16
    class parser(object):
 
17
        @classmethod
 
18
        def parse(cls, val):
 
19
            try:
 
20
                return datetime.strptime(val, '%m/%d/%Y')
 
21
            except:
 
22
                return val
 
23
 
 
24
from itertools import izip
 
25
import numpy as np
 
26
import string
 
27
 
 
28
def simpleParser(nestedList, forceFloat=True, colNames=None,
 
29
                 header=0, indexCol=0):
 
30
    """
 
31
    Workhorse function for processing nested list into DataFrame
 
32
    """
 
33
    naValues = set(['-1.#IND', '1.#QNAN', '1.#IND', 
 
34
                    '-1.#QNAN','1.#INF','-1.#INF', '1.#INF000000',
 
35
                    'NA', 'NULL', 'NaN', 'nan', ''])
 
36
    lines = nestedList
 
37
    data = {}
 
38
    if header is not None:
 
39
        columns = lines[header]
 
40
        columns = [c if c != '' else 'Unnamed: ' + string.ascii_uppercase[i] 
 
41
                   for i, c in enumerate(columns)]
 
42
        content = lines[header+1:]
 
43
 
 
44
        colCounts = dict(((col, 0) for col in columns))
 
45
        for i, col in enumerate(columns):
 
46
            if columns.count(col) > 1:
 
47
                columns[i] = col + str(colCounts[col])
 
48
                colCounts[col] += 1
 
49
    else:
 
50
        if not colNames:
 
51
            columns = string.ascii_uppercase[:len(lines[0])]
 
52
        else:
 
53
            columns = colNames
 
54
        content = lines
 
55
 
 
56
    for i, (c, col) in enumerate(izip(columns, izip(*content))):            
 
57
        if i == indexCol:
 
58
            data[c] = col
 
59
            continue
 
60
        data[c] = []
 
61
        for val in col:
 
62
            if val in naValues:
 
63
                val = np.nan
 
64
            else:
 
65
                try:    
 
66
                    tmp = val        
 
67
                    val = np.float64(val)
 
68
                    if isinf(val):
 
69
                        val = tmp
 
70
                except:
 
71
                    pass
 
72
            data[c].append(val)
 
73
 
 
74
    if header is not None:
 
75
        if 'date' in columns[0].lower() or 'Unnamed' in columns[0]:
 
76
            dates = []
 
77
            for s in data[columns[0]]:
 
78
                try:
 
79
                    dates.append(parser.parse(s))
 
80
                except:
 
81
                    dates.append(s)
 
82
            data[columns[0]] = dates
 
83
    for c, values in data.iteritems():
 
84
        try:
 
85
            data[c] = np.array(values, dtype = np.float64)
 
86
        except:
 
87
            data[c] = np.array(values, dtype = np.object_)            
 
88
    if indexCol is not None:
 
89
        index = Index(data[columns[indexCol]])
 
90
        frameData = dict([(col, data[col]) for col in columns \
 
91
                        if col != columns[indexCol]])
 
92
        return DataFrame(data=frameData, index=index)
 
93
    else:
 
94
        index = np.arange(len(data.values()[0]))
 
95
        frameData = dict([(col, data[col]) for col in columns])
 
96
        return DataFrame(data=frameData, index=index)
 
97
    
 
98
def parseCSV(filepath, header=0, indexCol=0):
 
99
    """
 
100
    Parse CSV file into a DataFrame object. Try to parse dates if possible.
 
101
    """
 
102
    import csv
 
103
    f = open(filepath,'rb')
 
104
    reader = csv.reader(f, dialect='excel')
 
105
    lines = [l for l in reader]
 
106
    f.close()
 
107
    return simpleParser(lines, header=header, indexCol=indexCol)
 
108
 
 
109
def parseText(filepath, sep='\t', header=0, indexCol=0, colNames = None):
 
110
    """
 
111
    Parse whitespace separated file into a DataFrame object. 
 
112
    Try to parse dates if possible.
 
113
    """
 
114
    lines = [l.rstrip().split(sep) for l in open(filepath,'rb').readlines()]
 
115
    return simpleParser(lines, header=header, indexCol=indexCol, 
 
116
                        colNames = colNames)
 
117
 
 
118
#===============================================================================
 
119
# Excel tools
 
120
#===============================================================================
 
121
 
 
122
OLE_TIME_ZERO = datetime(1899, 12, 30, 0, 0, 0)
 
123
def ole2datetime(oledt):
 
124
    """function for converting excel date to normal date format"""
 
125
    return OLE_TIME_ZERO + timedelta(days=float(oledt))  
 
126
 
 
127
def parseExcel(filepath, header = None, indexCol = 0, dateCol = 0, 
 
128
               sheetname = None):
 
129
    try:
 
130
        import xlrd
 
131
    except ImportError:
 
132
        raise ImportError('Sorry, you do not have xlrd.')
 
133
    book = xlrd.open_workbook(filepath)
 
134
    sheet = book.sheet_by_name(sheetname)
 
135
    data = [sheet.row_values(i) for i in range(sheet.nrows)]
 
136
    for row in data:
 
137
        try:
 
138
            row[0] = ole2datetime(row[0])
 
139
        except:
 
140
            pass
 
141
    return simpleParser(data, header = header, indexCol = indexCol)