2013-12-10 11 views

Antwort

0

Sie können dies über Art und Weise in einer Runde machen read_excel verwenden, es bietet:

skiprows : list-like 
    Rows to skip at the beginning (0-indexed) 

skip_footer : int, default 0 
    Rows at the end to skip (0-indexed) 

parse_cols : int or list, default None 
     If None then parse all columns, 
     If int then indicates last column to be parsed 
     If list of ints then indicates list of column numbers to be parsed 
     If string then indicates comma separated list of column names and column ranges (e.g. “A:E” or “A,C,E:F”) 

Das bedeutet, wenn Sie die Spaltennamen und die Zeilennummern wissen (? Vermutlich, was Sie unter „benannten Bereich“) Sie können nur diesen Abschnitt auswählen, um den DataFrame zu erstellen.

+0

Auf diese Weise können Sie Zeilen am Anfang überspringen. Es wird immer noch bis zur letzten leeren Zelle im Blatt gelesen. –

+0

Schauen Sie sich DataNitro an. Es ist eine ziemlich tolle Ergänzung für Excel, die genau diese Art von Sache sowie viele andere ermöglicht. Es ist kostenlos für nicht-kommerzielle Projekte. Ich benutze es ausgiebig –

+0

@DavidNehme ist das nicht der Punkt von skip_footer? (Ich stimme zu, das könnte mit einer netten Wrapper-Funktion tun ..) –

1

zitieren die Microsoft Office help pages:

A [benannten Bereich] ist eine sinnvolle Kurzschrift, die es einfacher zu verstehen, den Zweck einer Zelle bezieht, konstant, eine Formel oder Tabelle, von denen jeder sein kann, schwer auf dem ersten Blick zu verstehen.“

Benannte Bereiche in Tabellen zu einfachen Zugriff auf Daten über ODBC außerdem werden häufig verwendet und sind besonders nützlich, wenn es mehr Daten im selben Arbeitsblatt reichen. über ODBC Excel zu verbinden, Wählen Sie einfach die entsprechende Excel driver und eine SQL-Anweisung wie z.B .:

SELECT * 
FROM namedRange 

Der nützliche Befehl in Pandas wahrscheinlich read_sql würde senden.

In Windows Diese Lösung erfordert jedoch, dass Sie die installierten Software-Versionen (32-Bit oder 64-Bit) von Excel, die ODBC-Treiber und das Software-Paket, von dem Sie die ODBC-Verbindung öffnen ausrichten/rationalisieren. Als Beispiel benötigt eine installierte Excel 32-Bit-Version einen 32-Bit-ODBC-Treiber und normalerweise eine 32-Bit-Installation von Python. Hinweis: Dieser letzte Punkt muss noch für den Python-Fall bestätigt werden (ich bin ein Anfänger für Python), aber ich kann diesen Punkt für ODBC-Verbindungen, die von SAS, SPSS oder Stata gestartet werden, definitiv bestätigen.

Die vorherige Anforderung ist ein sehr signifikanter Nachteil und spricht tatsächlich für jede Lösung, die ODBC überhaupt nicht involviert. Allerdings wäre es schön, wenn read_Excel eine solche Einrichtung zur Verfügung stellen würde. In diesem Zusammenhang ist es interessant zu bemerken, dass SAS, SPSS und Stata derzeit keinen direkten Zugriff auf benannte Bereiche in ihren jeweiligen Excel-Filtern erlauben - also vielleicht gibt es einen objektiven Grund für dieses fehlende Merkmal ...

1

Sie können dazu das zugrunde liegende xlrd-Paket verwenden.

Das Paket xlrd enthält ein Verzeichnis examples, das xlrdnameAPIdemo.py enthält, wie in here dokumentiert.

In aller Kürze für den benannten Bereich print_area Versuch:

book = xlrd.open_workbook('examples/namesdemo.xls') 
name_obj = book.name_map['print_area'][0] 
print name_obj.__dict__ 

Sie werden name_obj sehen einen Eintrag:

'result': Operand(kind=oREF, value=[Ref3D(coords=(2, 3, 0, 4, 0, 14))], text=u'Sheet3!$A$1:$N$4') 

, die Sie das Beispiel zu interpretieren folgen kann, wenn es doesn t einfach aussehen - z. Der Bereich kann relativ sein oder nicht, abhängig vom Wert result.kind.

Weiter, als ich versuchte, dies zu verwenden, um meine eigene Tabelle zu lesen (erstellt auf einem Mac), fand ich result war None; stattdessen die einzige ref auf den Bereich in name_obj war:

'formula_text': u'Sheet1!$B$6:$E$11' 

So kann es eine Möglichkeit, diese Arbeit in einem allgemeinen Fall zu machen, aber es sieht aus wie es einige Versuch und Irrtum nehmen würde.

Wenn Sie Ihre Tabelle so formatieren können, dass Ihre Tabelle anstelle von benannten Bereichen in den Zeilen unmittelbar nach einer eindeutigen Überschrift (key) folgt und mit einer leeren Zeile endet, finden Sie hier eine Funktion, die die Tabelle findet

def table_position(path, sheet_name, key): 
    """ 
    Find the start and end rows of a table in an Excel spreadsheet 
    based on the first occurence of key text on the sheet, and down 
    to the first blank line. 

    Returns (col, start_row, end_row, skip_footer) 

    where: 
     col is the column number containing the key text, 
     start_row is the row after this, 
     end_row is the row number of the next blank line, 
     skip_footer is how many rows from the end of the sheet this is. 

    You can then read in the table with: 
     x = pd.read_excel(path, sheet_name, skiprows=start, skip_footer=skip_footer, header=0) 
     x = x.dropna(axis=1, how='all') 
    """ 
    import xlrd 
    book = xlrd.open_workbook(path) 
    sheet = book.sheet_by_name(sheet_name) 
    # find the first occurrence of the key, and the next line break 
    (col, start, end) = (-1, -1, sheet.nrows) 
    for rownum in xrange(sheet.nrows): 
     if col<0: # look for key to start the table off 
      try: 
       test_col = next(c for c in xrange(sheet.ncols) if sheet.cell(rownum, c).value==key) 
      except StopIteration: 
       pass 
      else: 
       col, start = test_col, rownum+1 # row after key text is the start 
     else: # test for blank line as end of table 
      if not [True for cell in sheet.row(rownum) if cell.value]: 
       end = rownum 
       break 
    skip_footer = sheet.nrows - end 
    return (col, start, end, skip_footer) 

Wenn Sie diese folgen mit einem pd.read_excel dann zweimal die Datendatei, die Sie lesen, was dumm ist, aber Sie bekommen die Idee: richtigen Parameter zu pd.read_excel zu senden.

0

Vielleicht werden irgendwann Pandas dies nativ unterstützen. Bis dahin verwende ich eine Hilfsfunktion:

import pandas as pd 
import openpyxl 

def data_frame_from_xlsx(xlsx_file, range_name): 
    """ Get a single rectangular region from the specified file. 
    range_name can be a standard Excel reference ('Sheet1!A2:B7') or 
    refer to a named region ('my_cells').""" 
    wb = openpyxl.load_workbook(xlsx_file, data_only=True, read_only=True) 
    if '!' in range_name: 
     # passed a worksheet!cell reference 
     ws_name, reg = range_name.split('!') 
     if ws_name.startswith("'") and ws_name.endswith("'"): 
      # optionally strip single quotes around sheet name 
      ws_name = ws_name[1:-1] 
     region = wb[ws_name][reg] 
    else: 
     # passed a named range; find the cells in the workbook 
     full_range = wb.get_named_range(range_name) 
     if full_range is None: 
      raise ValueError(
       'Range "{}" not found in workbook "{}".'.format(range_name, xlsx_file) 
      ) 
     # convert to list (openpyxl 2.3 returns a list but 2.4+ returns a generator) 
     destinations = list(full_range.destinations) 
     if len(destinations) > 1: 
      raise ValueError(
       'Range "{}" in workbook "{}" contains more than one region.' 
       .format(range_name, xlsx_file) 
      ) 
     ws, reg = destinations[0] 
     # convert to worksheet object (openpyxl 2.3 returns a worksheet object 
     # but 2.4+ returns the name of a worksheet) 
     if isinstance(ws, str): 
      ws = wb[ws] 
     region = ws[reg] 
    df = pd.DataFrame([cell.value for cell in row] for row in region) 
    return df 
0

Hier ist die Art, wie ich openpyxl verwenden, um einen Bereich in einem [[]] kopieren:

wb = load_workbook(filename=xlPath) 
ws, range= next(wb.defined_names["rangename"].destinations) 
materials = [[cell.value for cell in row] for row in wb[ws][range]] 
Verwandte Themen