从pandas数据框的列索引中获取string列表

首先,我的.xlsx时间序列数据如下所示:

什么数据看起来像在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行)以及值读入pandas数据框,并能够以string列表的forms访问标签和单元行。 我似乎无法弄清楚如何加载第2行和第3行,并有时间读入正确的pandasdatetimeindex,但它工作正常,如果我只上传标签。 另外,我已经到处找,并不知道如何获得列标题列表。

如果有人能帮助解决这些问题,我将不胜感激。

首先,摆脱for i in range(len(filepaths)) ! Pythonic的方式是for i, filepath in enumerate(filepaths)enumerate给出一个元组,所以你可以说ExcelFile(filepath)而不是ExcelFile(filepaths[i])

我认为你的两个问题是相关的。 如果我正确读取代码,当包含第2行和第3行时,date不能被parsing,因为时间戳列不是同质的。 这不是全部时间戳。

您可以使用分层索引来获取(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 

这应该让你在你的代码中开始删除列并开始连接。 也看看开发人员的文档 。 它看起来像阅读Excel文件的语法正在清理(更好!)。 您可以使用带有ints列表的parse_cols参数以避免以后丢弃列。

哦,你可以得到df_data.columns.tolist()的string列表