2013-07-17 51 views
7

Mục tiêu của tôi với tập lệnh này là: 1.Xem dữ liệu timseries từ tệp excel (> 100.000 nghìn hàng) cũng như tiêu đề (Nhãn, Đơn vị) 2.convert excel numeric ngày để đối tượng datetime tốt nhất cho gấu trúc dataFrame 3.Be có thể sử dụng dấu thời gian để tham chiếu các hàng và nhãn chuỗi để tham chiếu cộtSắp xếp dữ liệu đọc từ Excel sang Pandas DataFrame

Cho đến nay tôi đã sử dụng xlrd để đọc dữ liệu excel vào danh sách. Made pandas Series với mỗi danh sách và danh sách thời gian được sử dụng làm chỉ mục. Loạt kết hợp với tiêu đề chuỗi để tạo từ điển python. Chuyển từ điển sang gấu trúc DataFrame. Mặc dù những nỗ lực của tôi df.index dường như được thiết lập để các tiêu đề cột và tôi không chắc chắn khi nào để chuyển đổi ngày thành đối tượng datetime.

Tôi mới bắt đầu sử dụng python 3 ngày trước để mọi lời khuyên sẽ tuyệt vời! Dưới đây là mã của tôi:

#Open excel workbook and first sheet 
    wb = xlrd.open_workbook("C:\GreenCSV\Calgary\CWater.xlsx") 
    sh = wb.sheet_by_index(0) 

    #Read rows containing labels and units 
    Labels = sh.row_values(1, start_colx=0, end_colx=None) 
    Units = sh.row_values(2, start_colx=0, end_colx=None) 

    #Initialize list to hold data 
    Data = [None] * (sh.ncols) 

    #read column by column and store in list 
    for colnum in range(sh.ncols): 
     Data[colnum] = sh.col_values(colnum, start_rowx=5, end_rowx=None) 

    #Delete unecessary rows and columns 
    del Labels[3],Labels[0:2], Units[3], Units[0:2], Data[3], Data[0:2] 

    #Create Pandas Series 
    s = [None] * (sh.ncols - 4) 
    for colnum in range(sh.ncols - 4): 
     s[colnum] = Series(Data[colnum+1], index=Data[0]) 

    #Create Dictionary of Series 
    dictionary = {} 
    for i in range(sh.ncols-4): 
     dictionary[i]= {Labels[i] : s[i]} 

    #Pass Dictionary to Pandas DataFrame 
    df = pd.DataFrame.from_dict(dictionary) 
+1

Bạn đã thử pd.read_excel chưa? (http://pandas.pydata.org/pandas-docs/dev/io.html) – user1827356

+0

Cảm ơn bạn đã bình luận! Tôi sẽ cung cấp cho nó một shot nhưng nếu nó là bất cứ điều gì như pd.read_csv tôi sẽ cần phải sử dụng một mã như thế này bởi vì pd.read_csv chỉ có vẻ hoạt động đúng nếu chỉ có một dòng tiêu đề cột và không có khoảng trống trước khi dữ liệu. – pbreach

+0

Bạn có thể bỏ qua hàng thứ hai với các tùy chọn 'bỏ qua'. IMO nó chắc chắn đáng giá để xem xét các tùy chọn cho pd.read_csv (đặc biệt là skiprows, skipinitialspace, parse_dates) – user1827356

Trả lời

9

Bạn có thể sử dụng gấu trúc trực tiếp ở đây, tôi thường thích để tạo ra một từ điển của DataFrames (với các phím là tên sheet):

In [11]: xl = pd.ExcelFile("C:\GreenCSV\Calgary\CWater.xlsx") 

In [12]: xl.sheet_names # in your example it may be different 
Out[12]: [u'Sheet1', u'Sheet2', u'Sheet3'] 

In [13]: dfs = {sheet: xl.parse(sheet) for sheet in xl.sheet_names} 

In [14]: dfs['Sheet1'] # access DataFrame by sheet name 

Bạn có thể kiểm tra docs on the parse cung cấp một số tùy chọn khác (ví dụ: skiprows) và các tùy chọn này cho phép bạn phân tích các trang tính riêng lẻ với nhiều quyền kiểm soát hơn ...

+0

Cảm ơn câu trả lời của bạn nhưng có vẻ như điều này là rất chậm. Tôi chỉ tải một tờ ~ 90k hàng và mất khoảng 40 giây trong MATLAB nếu tôi đã sử dụng lệnh xlsread() có thể so sánh sử dụng COM mất khoảng 10 giây. Ngoài ra tôi sẽ có 9 workbook như thế này để tải. Có cách nào nhanh hơn để làm điều này bằng cách sử dụng COM trong python? Bất cứ ai sử dụng điều này sẽ chắc chắn có excel và sẽ là cửa sổ 7. – pbreach

+0

Tôi chuyển đổi tập tin của tôi để csv và đang sử dụng pd.read_csv và nó vẫn mất khoảng 35 giây. Vẫn còn rất chậm nhưng tôi đoán đó có thể là do chuyển đổi datetime. – pbreach

Các vấn đề liên quan