2013-07-17 5 views
7

이 스크립트의 목표는 다음과 같습니다. 1. excel 파일 (> 100,000k 행) 및 헤더 (라벨, 단위)의 1.read timseries 데이터 입력 2.convert excel numeric 판다에 가장 가까운 날짜 시간 객체에 대한 날짜 dataFrame 3. 타임 스탬프를 사용하여 참조 열로 행과 시리즈 레이블을 참조 할 수 있습니까?Excel에서 Pandas DataFrame으로 데이터를 구성하는 과정

지금까지 xlrd를 사용하여 Excel 데이터를 목록으로 읽었습니다. 각 목록과 사용 된 시간 목록을 색인으로 사용하여 팬더 시리즈를 만들었습니다. 직렬 헤더와 함께 파이썬 사전을 만드는 시리즈. pandas DataFrame에 사전을 전달했습니다. 그럼에도 불구하고 df.index는 열 머리글로 설정되어있는 것으로 보이며 날짜를 datetime 객체로 변환 할 시점이 확실치 않습니다.

난 단지 3 일 전부터 파이썬을 사용하기 시작 했으므로 어떤 조언이 좋을 것입니다! 여기에 내 코드입니다 :

#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

pd.read_excel을 시도 했습니까? (http://pandas.pydata.org/pandas-docs/dev/io.html) – user1827356

+0

의견을 보내 주셔서 감사합니다! 나는 그것을 줄 것이다. 그러나 만약 pd.read_csv와 같은 것이라면, pd.read_csv는 단지 한 줄의 열 헤더가 있고 데이터 앞에 공백이 없다면 제대로 작동하는 것처럼 보이기 때문에 이와 같은 코드를 사용해야 할 것이다. – pbreach

+0

'skiprows'옵션을 사용하여 두 번째 행을 건너 뛸 수 있습니다. IMO 그것은 확실히 pd.read_csv (특히 skiprows, skipinitialspace, parse_dates) 옵션을 살펴볼 가치가 있습니다. – user1827356

답변

9
당신은 내가 보통 (키 시트 이름 인 상태) DataFrames의 사전을 만들려면, 바로 여기에 팬더를 사용할 수 있습니다

:

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 

당신은 docs on the parse을 확인하실 수 있습니다 몇 가지 옵션 (예 : skiprows)을 제공하는이 옵션을 사용하면 더 많은 제어를 통해 개별 시트를 구문 분석 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그러나 이것은 매우 느린 것 같습니다. 나는 단지 한 시트 ~ 90k 행을로드하고 COM을 사용하는 비슷한 xlsread() 명령을 사용하면 약 10 초가 걸리므로 matlab에서 약 40 초가 걸린다. 또한로드 할 수있는 9 개의 통합 문서가 있습니다. 파이썬에서 COM을 사용하여 이것을 수행하는 더 빠른 방법이 있습니까? 이것을 사용하는 사람은 분명히 Excel 7을 사용하게됩니다. – pbreach

+0

내 파일을 csv로 변환하고 pd.read_csv를 사용하고 있는데 약 35 초가 걸립니다. 여전히 매우 느리지 만 datetime 변환으로 인한 것 같아요. – pbreach

관련 문제