从Excel读取的数据如何整理到Pandas DataFrame中

8

我的脚本的目标是: 1.从Excel文件(> 100,000k行)中读取时间序列数据以及标题(标签,单位) 2.将Excel数字日期转换为最佳pandas DataFrame datetime对象 3.能够使用时间戳引用行和系列标签引用列

到目前为止,我使用xlrd将Excel数据读入列表中。使用每个列表创建pandas Series,并使用时间列表作为索引。将Series与Series标题组合成Python字典。将字典传递给pandas DataFrame。尽管我已经尽力了,但df.index似乎设置为列标题,而我不确定何时将日期转换为datetime对象。

我刚刚开始使用Python 3天,所以任何建议都会很好!这是我的代码:

    #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吗?(http://pandas.pydata.org/pandas-docs/dev/io.html) - user1827356
谢谢你的评论!我会尝试一下,但如果它与pd.read_csv类似,我将需要使用这样的代码,因为如果数据之前有多行列标题或空白行,pd.read_csv似乎只能正常工作。 - pbreach
你可以使用'skiprows'选项跳过第二行。在我看来,值得关注的是pd.read_csv的选项(特别是skiprows、skipinitialspace和parse_dates)。 - user1827356
1个回答

12
您可以直接在此处使用pandas,我通常喜欢创建一个DataFrame字典(键为工作表名称):

您可以直接在此处使用pandas,我通常会创建一个数据帧(DataFrame)字典,其中键是工作表的名称:

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

您可以查看parse文档,其中提供了一些更多的选项(例如skiprows),这让您能够以更精细的方式解析单个工作表...


谢谢您的回答,但似乎这个方法很慢。我只加载了一个表格,大约有90k行,如果我使用类似于xlsread()命令的COM命令,在Matlab中需要大约40秒,而在使用COM的情况下,只需要大约10秒。此外,我还需要加载9个类似的工作簿。是否有更快的方法可以在Python中使用COM来完成这项任务?任何使用此方法的人都一定会有Excel,并且使用的是Windows 7。 - pbreach
我将文件转换为csv,并使用pd.read_csv,但仍需要大约35秒的时间。仍然非常慢,但我猜这可能是由于日期时间转换导致的。 - pbreach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接