2013-07-23 246 views
1

第一關的列索引獲取字符串列表,這裏是我的.xlsx時間序列數據的模樣:從熊貓數據框中

What the data looks like in excel

這裏如何我讀它:

def loaddata(filepaths): 
    t1 = time.clock() 
    for i in range(len(filepaths)): 
     xl = pd.ExcelFile(filepaths[i]) 
     df = xl.parse(xl.sheet_names[0], header=0, index_col=2, skiprows=[0,2,3,4], parse_dates=True) 
     df = df.dropna(axis=1, how='all') 
     df = df.drop(['Decimal Year Day', 'Decimal Year Day.1', 'RECORD'], axis=1) 
     df.index = pd.DatetimeIndex(((df.index.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)).values 

     if i == 0: 
      dfs = df 
     else: 
      dfs = concat([dfs, df], axis=1) 

    t2 = time.clock() 
    print "Files loaded into dataframe in %s seconds" %(t2-t1) 

    return dfs 

files = ["London Lysimeters corrected 5min.xlsx"] 
data = loaddata(files) 

我需要做的是將列標籤AND單元(第2行和第3行)以及值讀入熊貓數據框,並且能夠以字符串列表的形式訪問標籤和單元行。我似乎無法弄清楚如何加載第2行和第3行,並將時間正確讀入pandas datetimeindex中,但如果僅上載標籤,則工作正常。此外,我已到處尋找,無法弄清楚如何將列標題作爲列表。

如果有人能夠幫助解決這些問題,我將不勝感激。

回答

1

首先,擺脫那for i in range(len(filepaths))! pythonic的方式是for i, filepath in enumerate(filepaths)enumerate給出了一個元組,所以你可以說ExcelFile(filepath)而不是ExcelFile(filepaths[i])

我認爲你的兩個問題是相關的。如果我正確讀取代碼,當包含第2行和第3行時,由於時間戳列不是同質的,因此無法分析日期。這不是全部時間戳。

您可以使用Hierarchical index獲取(column, label, unit)格式的數據。首先閱讀標題信息可能是最容易的。然後分別讀取數據和事實後設置的列(我沒有Excel方便的權利,但我認爲所有的read_csv選項我用的都是提供給xlrd也):

In [7]: df_header = pd.read_csv('test.csv', nrows=2, index_col='three') 

In [8]: df_header 
Out[8]: 
       one  two four 
three        
Timestamp Decimal Decimal record 
ts    ref  ref  rn 

In [9]: df_data = pd.read_csv('test.csv', names=df_header.columns, 
    ...:      skiprows=4, parse_dates=True, index_col=2) 

In [10]: df_data 
Out[10]: 
         one two four 
2012-08-29 07:10:00 32.1 32.0 232 
2012-08-29 09:10:00 1.1 1.2 233 

In [11]: cols = pd.MultiIndex.from_tuples([tuple([x] + df_header[x].tolist()) 
    ....:         for x in df_header]) 

In [12]: cols 
Out[12]: 
MultiIndex 
[one Decimal ref, two Decimal ref, four record rn ] 

In [14]: df_data.columns = cols 

In [15]: df_data 
Out[15]: 
         one  two four 
        Decimal Decimal record 
         ref  ref  rn 
2012-08-29 07:10:00  32.1  32.0  232 
2012-08-29 09:10:00  1.1  1.2  233 

這應該讓你到您的代碼中您開始刪除列並開始連接的位置。另請看developers docs。它看起來像閱讀Excel文件的語法正在清理(更好!)。您可以使用帶有ints列表的parse_cols參數以避免以後丟棄列。

哦,你可以得到字符串列表與df_data.columns.tolist()

+0

不幸的是我不能做一個雙讀,因爲它需要30-40s加載了每個表和程序將需要加載的12-16張每次都是相同的大小,即使每個文件的第一次讀取量很小,仍需要一段時間才能開始。但是,能夠獲取字符串將非常方便,因爲我現在可以使用它們來創建組合框並繪製數據,而目前沒有單位。感謝你! – pbreach

+0

也許考慮設置一個塊大小等於頭的長度,並連接除第一塊以外的所有塊。這將分裂成標題,數據,而只打開每個文件一次。 – TomAugspurger