【问题标题】:Read multiple excel file with different sheets names in pandas在熊猫中读取具有不同工作表名称的多个excel文件
【发布时间】:2014-02-03 05:22:27
【问题描述】:

要从目录中读取文件,请尝试以下操作:

import os
import pandas as pd
path=os.getcwd()
files=os.listdir(path)
files

['wind-diciembre.xls', 'stat_noviembre.xls', 'stat_marzo.xls', 'wind-noviembre.xls', 'wind-enero.xls', 'stat_octubre.xls', 'wind-septiembre.xls', 'stat_septiembre.xls', 'wind-febrero.xls', 'wind-marzo.xls', 'wind-julio.xls', 'wind-octubre.xls', 'stat_diciembre.xls', 'stat_julio.xls', 'wind-junio.xls', 'stat_abril.xls', 'stat_enero.xls', 'stat_junio.xls', 'stat_agosto.xls', 'stat_febrero.xls', 'wind-abril.xls', 'wind-agosto.xls']

地点:

stat_enero

     Fecha  HR  PreciAcu  RadSolar     T  Presion  Tmax  HRmax  \
01/01/2011  37         0       162  18.5        0  31.2     86   
02/01/2011  70         0        58  12.0        0  14.6     95   
03/01/2011  62         0       188  15.3        0  24.9     86   
04/01/2011  69         0       181  17.0        0  29.2     97 
     .
     .
     .

          Presionmax  RadSolarmax  Tmin  HRmin  Presionmin  
    0            0          774  12.3      9           0  
    1            0          314   9.2     52           0  
    2            0          713   8.3     32           0  
    3            0          730   7.7     26           0
    .
    .
    .

 wind-enero

            Fecha  MagV  MagMax  Rachas  MagRes  DirRes DirWind
01/08/2011 00:00   4.3    14.1    17.9     1.0   281.3     ONO
02/08/2011 00:00   4.2    15.7    20.6     1.5    28.3     NNE
03/08/2011 00:00   4.6    23.3    25.6     2.9    49.2     ENE
04/08/2011 00:00   4.8    17.9    23.0     2.0    30.5     NNE
    .
    .
    .

下一步是读取、解析文件并将其添加到数据框,现在我执行以下操作:

for f in files:
    data=pd.ExcelFile(f)
    data1=data.sheet_names
    print data1
    [u'diciembre']
    [u'Hoja1']
    [u'Hoja1']
    [u'noviembre']
    [u'enero']
    [u'Hoja1']
    [u'septiembre']
    [u'Hoja1']
    [u'febrero']
    [u'marzo']
    [u'julio']
        .
        .
        .

for sheet in data1:
    data2=data.parse(sheet)
data2
                Fecha  MagV  MagMax  Rachas  MagRes  DirRes DirWind
01/08/2011 00:00   4.3    14.1    17.9     1.0   281.3     ONO
02/08/2011 00:00   4.2    15.7    20.6     1.5    28.3     NNE
03/08/2011 00:00   4.6    23.3    25.6     2.9    49.2     ENE
04/08/2011 00:00   4.8    17.9    23.0     2.0    30.5     NNE
05/08/2011 00:00   6.0    22.5    26.3     4.4    68.7     ENE
06/08/2011 00:00   4.9    23.8    23.0     3.3    57.3     ENE
07/08/2011 00:00   3.4    12.9    20.2     1.6   104.0     ESE
08/08/2011 00:00   4.0    20.5    22.4     2.6    79.1     ENE
09/08/2011 00:00   4.1    22.4    25.8     2.9    74.1     ENE
10/08/2011 00:00   4.6    18.4    24.0     2.3    52.1     ENE
11/08/2011 00:00   5.0    22.3    27.8     3.3    65.0     ENE
12/08/2011 00:00   5.4    24.9    25.6     4.1    78.7     ENE
13/08/2011 00:00   5.3    26.0    31.7     4.5    79.7     ENE
14/08/2011 00:00   5.9    31.7    29.2     4.5    59.5     ENE 
15/08/2011 00:00   6.3    23.0    25.1     4.6    70.8     ENE
16/08/2011 00:00   6.3    19.5    30.8     4.8    64.0     ENE
17/08/2011 00:00   5.2    21.2    25.3     3.9    57.5     ENE
18/08/2011 00:00   5.0    22.3    23.7     2.6    59.4     ENE
19/08/2011 00:00   4.4    21.6    27.5     2.4    57.0     ENE

上面的输出只显示了文件的一部分,我如何解析所有文件并将它们添加到数据框

【问题讨论】:

  • 在最后一个循环中,您是在用 data2 做其他事情,还是只是在阅读它?您是否尝试将其附加到列表并concatenating 结果?
  • 如果您仍有问题,请分享问题所在,以便我们提供帮助?如果没有,请将您的问题标记为已回答。

标签: python pandas


【解决方案1】:

首先,您似乎在这些文件中有几个不同的数据集。您可能希望将它们全部放在一个数据框中,但现在,我假设您希望将它们分开。例如(一个数据帧中的所有 wind*.xls 文件和另一个数据帧中的所有 stat*.xls 文件。)您可以使用 read_excel 解析数据,然后使用时间戳作为索引连接结果,如下所示:

import numpy as np
import pandas as pd, datetime as dt
import glob, os

runDir = "Path to files"

if os.getcwd() != runDir:
    os.chdir(runDir)

files = glob.glob("wind*.xls")

df = pd.DataFrame()

for each in files:
    sheets = pd.ExcelFile(each).sheet_names

    for sheet in sheets:
        df = df.append(pd.read_excel(each, sheet, index_col='Fecha'))

您现在有了一个时间索引数据框!如果您真的想在一个数据帧中包含所有数据(来自所有文件类型),您可以调整glob 以使用glob.glob('*.xls') 之类的内容包含所有文件。我会从个人经验中警告说,您可能更容易分别读取每种类型的数据,然后在您完成一些错误检查/修改等之后合并它们。

【讨论】:

    【解决方案2】:

    下面的解决方案只是对上面@DavidHagan 答案的一个小调整。

    这个包括一列来识别读取的文件编号,如F0、F1等 每个文件的工作表编号为 S0、S1 等 这样我们就可以知道这些行是从哪里来的。

    import numpy as np
    import pandas as pd, datetime as dt
    import glob, os
    import sys
    
    runDir = r'c:\blah\blah'
    
    if os.getcwd() != runDir:
        os.chdir(runDir)
    
    files = glob.glob(r'*.*xls*')
    
    df = pd.DataFrame()
    
    #fno is 0, 1, 2, ... (for each file)
    for fno, each in enumerate(files):
    
        sheets = pd.ExcelFile(each).sheet_names
    
        # sno iss 0, 1, 2, ... (for each sheet)
        for sno, sheet in enumerate(sheets):
    
            FileNo = 'F' + str(fno) #F0, F1, F2, etc.
            SheetNo = 'S' + str(sno) #S0, S1, S2, etc.
    
            # print FileNo, SheetNo, each, sheet #debug info
    
            #header = None if you don't want header or take this out.
            #dfxl is dataframe of each xl sheet
    
            dfxl = pd.read_excel(each, sheet, header=None)
    
            #add column of FileNo and SheetNo to the dataframe
            dfxl['FileNo'] = FileNo
            dfxl['SheetNo'] = SheetNo
    
            #now add the current xl sheet to main dataframe
            df = df.append(dfxl)
    

    完成上述操作后.. 即将多个 XL 文件和表格读取到单个数据框 (df)... 您可以这样做.. 从每个文件、表格组合中获取示例行.. 并且示例将可用在数据帧(dfs1)中。

    #get unique FileNo and SheetNo in dft2
    dft2 = df.loc[0,['FileNo', 'SheetNo']]
    
    #empty dataframe to collect sample from each of the read file/sheets
    dfs1 = pd.DataFrame()
    
    #loop through each sheet and fileno names
    for row in dft2.itertuples():   
    
        #get a sample from each file to view
        dfts = df[(df.FileNo == row[1]) & (df.SheetNo ==row[2])].sample(1)
    
        #append the 1 sample to dfs1. this will have a sample row
        # from each xl sheet and file
        dfs1 = dfs1.append(dfts, ignore_index = True) 
    
    dfs1.to_clipboard()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2013-08-27
      • 2017-02-20
      • 2018-10-05
      • 2015-10-17
      • 2019-11-27
      • 2021-04-28
      • 2018-12-16
      相关资源
      最近更新 更多