2013-07-23 250 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