2013-07-17 15 views
7

Amacım bu betikle: 1.gönderim dosyası, excel dosyasından (> 100,000k satır) ve üstbilgilerde (Etiketler, Birimler) 2.convert excel numeric pandas dataFrame için en iyi datetime nesnesine tarihler 3.Bir satırlara ve seri etiketlere referans vermek için zaman damgaları kullanılabilir sütunlara başvuru yapabilirVeriyi Excel'den Panda'ya aktarıyor VeriFrame

Şimdiye kadar excel verilerini bir listeye okumak için xlrd'yi kullandım. Her liste ile pandalar serisi yapılmış ve indeks olarak kullanılan zaman listesi kullanılmıştır. Python sözlüğü yapmak için dizi başlıklarıyla birleştirilmiş seri. Panda DataFrame için sözlük geçti. Çabalarıma rağmen df.index sütun başlıklarına ayarlanmış gibi görünüyor ve tarihleri ​​datetime nesnesine ne zaman dönüştüreceğimi bilmiyorum.

3 gün önce python kullanmaya başladım, böylece herhangi bir tavsiye harika olurdu! İşte benim kod:

#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'i denediniz mi? (http://pandas.pydata.org/pandas-docs/dev/io.html) – user1827356

+0

Yorumunuz için teşekkürler! Bir çekim yapacağım ama eğer pd.read_csv gibi bir şey varsa bunun gibi bir kod kullanmam gerekecek çünkü pd.read_csv sadece bir satır sütun başlığı ve veriden önce bir boşluk yoksa düzgün çalışıyor gibi görünüyor. – pbreach

+0

İkinci satırı "atla" seçenekleri ile atlayabilirsiniz. IMO, pd.read_csv (özellikle skiprows, skipinitialspace, parse_dates) seçeneklerine bakmak için kesinlikle faydalıdır. – user1827356

cevap

9
Sen Ben genellikle (tuşlar sayfa adı olmak) DataFrames sözlüğü oluşturmak ister, doğruca buraya panda kullanabilirsiniz

:

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 

Sen docs on the parse kontrol edebilirsiniz Daha fazla seçenek sunan (örneğin, skiprows) ve bunlar daha fazla denetim ile tek tek sayfaları ayrıştırmanıza olanak tanır ...

+0

Cevabınız için teşekkürler, ancak bu çok yavaş görünüyor. Sadece bir satır ~ 90k satır yüklüyorum ve COM'u kullanan bir karşılaştırılabilir xlsread() komutunu kullanmam yaklaşık 10 saniye sürdüğünde matlabda yaklaşık 40 saniye sürüyor. Ayrıca yüklenecek 9 tane çalışma kitabım olacak. Bunu Python'da COM kullanarak daha hızlı bir yolu var mı? Bunu kullanan herkes kesinlikle mükemmel olacak ve Windows 7 olacak. – pbreach

+0

Dosyamı csv'ye dönüştürdüm ve pd.read_csv dosyasını kullanıyorum ve hala yaklaşık 35 saniye sürüyor. Hala çok yavaş ama sanırım bu datetime dönüşümü yüzünden olabilir. – pbreach

İlgili konular