首先,这是我的.xlsx时间序列数据的样子:
以下是我正在阅读的内容:
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数据帧,并能够以字符串列表的形式访问标签和单位行。我似乎无法弄清楚如何加载第2行和第3行并将时间正确读入pandas datetimeindex,但如果我只上传标签,它可以正常工作。此外,我到处寻找,无法弄清楚如何将列标题作为列表。
如果有人能帮助解决这两个问题,我将不胜感激。
答案 0 :(得分: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文件的语法正在被清理(更好!)。您可以将parse_cols
参数与int列表一起使用,以避免以后删除列。
哦,您可以使用df_data.columns.tolist()