2016-11-02 21 views
0

これは、フォローアップの質問はにある:私は、Excelファイルに同じソートを行うことを計画していますPyQt: How to sort QTableView columns(strings and numericals)PyQtは:ExcelファイルのQTableViewの列をソートする方法(文字列やnumericalsとDATETYPE)

ここに私のコードです:

self.Upload = QtGui.QPushButton() 
self.Upload.clicked.connect(self.showOpenDialog) 
self.Table = QtGui.QPushButton() 
self.table.clicked.connect(self.LoadTable) 


def showOpenDialog(self): 
    fileName = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home') 
    if (".xls" or ".xml" or ".xlsx" or ".xlsm") in fileName: 
     with open(fileName, 'rb') as drate: 
      self.Datas = pd.read_excel(drate, index_col=0) 
     self.Loaded_File.clear() 
     self.Loaded_File.append(fileName) 
     colll = self.Datas.dtypes.index 
     col_names = np.array(colll) 


def LoadTable(self): 
    tab_table_view = QtGui.QWidget() 
    self.Tab.insertTab(0, tab_table_view, self.File_Name) 
    self.tableView = QtGui.QTableView(tab_table_view) 
    self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571)) 
    self.model = QtGui.QStandardItemModel(self) 
    file_name_temp = self.File_Name 
    self.tableView.setModel(self.model) 
    colll = self.Datas.dtypes.index 
    col_names = np.array(colll) 
    col_names = np.insert(col_names, 0, self.Datas.index.name) 
    self.model.setHorizontalHeaderLabels(col_names) 
    self.tableView.hideRow(0) 
    self.tableView.setSortingEnabled(True) 

      if (".xls" or ".xml" or ".xlsx" or ".xlsm") in self.File_Name: 
     from itertools import chain 
     ii = 1 
     book = xlrd.open_workbook(self.File_Name) 
     sheet = book.sheet_by_index(0) 
     num_col = len(self.Datas.columns) 
     num_row = len(self.Datas) 
     print(num_col,num_row) 
     self.Matrix = [[0 for x in range(num_col+1)] for y in range(num_row)] 
     for i in range(num_row): 
      self.Matrix[i][0]=self.Datas.index.values[i] 
      for j in range(num_col): 
       self.Matrix[i][j+1] = self.Datas.iat[i,j] 
     print(self.Matrix) 
     for i in range(num_row): 
      items = [] 
      for j in range(num_col): 
       field = self.Matrix[i][j] 
       item = QtGui.QStandardItem(field) 
       for numtype in (int, float): 
        try: 
         data = numtype(field) 
         break 
        except (ValueError, OverflowError): 
         pass 
       else: 
        print('Not a number: %r' % field) 
        data = field 
       item.setData(data, QtCore.Qt.UserRole) 
      items.append(item) 
      self.model.appendRow(items) 

は、出力は次のようになります。

Not a number: 'Government' 
Not a number: 'Canada' 
Not a number: 'Carretera' 
Not a number: 'None' 
Traceback (most recent call last): 
    File "C:/Users/v266v885/Documents/Main_File1026.py", line 1535, in loadTable 
    item = QtGui.QStandardItem(field) 
TypeError: arguments did not match any overloaded call: 
    QStandardItem(): too many arguments 
    QStandardItem(str): argument 1 has unexpected type 'Timestamp' 
    QStandardItem(QIcon, str): argument 1 has unexpected type 'Timestamp' 
    QStandardItem(int, int columns=1): argument 1 has unexpected type 'Timestamp' 
    QStandardItem(QStandardItem): argument 1 has unexpected type 'Timestamp' 

データ型がファイル内のstr(最大で "None"まで)であれば問題ありません。最初のintまたはfloatが来ると、オーバーロードされた呼び出しが生成されます。

私を助けてください。

+1

:ここ

from PyQt4 import QtGui , QtCore import pandas as pd import numpy as np import time import sys # open excel file sales = pd.read_excel ("Sales.xlsx" , parse_dates=['Data']) # select columns purchase_patterns = sales [['Total','Date']] # choose date index purchase_patterns = purchase_patterns.set_index("Date") # regroup/resample by week and get subtotals by sum resample = purchase_patterns.resample ('W' , how = sum) 

は、いくつかの素晴らしいリンクです問題があります。 – ekhumoro

+1

@ekhumoro私は今質問を説明しました。 – learncode

+1

申し訳ありませんが、私はそのコードを理解できません。 「self.Datas」が何であるか、それがどのようにExcelワークシート(どのように使用されていないようだ)に関係するか分からないので、私はそれをテストすることは不可能です。なぜヘッダを設定するために 'np.array'を使用していますか?なぜ、あなたはテーブルの最初の行と同じヘッダを追加するように見えますか?そして、他の行を構築する方法にはどうやって到達しましたか? – ekhumoro

答えて

2

以下は、csvファイルとexcelファイルの両方を読み込み、日付、整数、浮動小数点数、および文字列を正しくソートするデモスクリプトです。

import sys 
import pandas as pd, numpy as np 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.model = QtGui.QStandardItemModel(self) 
     self.model.setSortRole(QtCore.Qt.UserRole) 
     self.tableView = QtGui.QTableView() 
     self.tableView.setSortingEnabled(True) 
     self.tableView.setModel(self.model) 
     self.button = QtGui.QPushButton('Open CSV', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.tableView) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     filters = (
      'CSV files (*.csv *.txt)', 
      'Excel Files (*.xls *.xml *.xlsx *.xlsm)', 
      ) 
     path, filter = QtGui.QFileDialog.getOpenFileNameAndFilter(
      self, 'Open File', '', ';;'.join(filters)) 
     if path: 
      csv = filter.startswith('CSV') 
      if csv: 
       dataframe = pd.read_csv(path) 
      else: 
       dataframe = pd.read_excel(path) 
      self.model.setRowCount(0) 
      dateformat = '%m/%d/%Y' 
      rows, columns = dataframe.shape 
      for row in range(rows): 
       items = [] 
       for column in range(columns): 
        field = dataframe.iat[row, column] 
        if csv and isinstance(field, str): 
         try: 
          field = pd.to_datetime(field, format=dateformat) 
         except ValueError: 
          pass 
        if isinstance(field, pd.tslib.Timestamp): 
         text = field.strftime(dateformat) 
         data = field.timestamp() 
        else: 
         text = str(field) 
         if isinstance(field, np.number): 
          data = field.item() 
         else: 
          data = text 
        item = QtGui.QStandardItem(text) 
        item.setData(data, QtCore.Qt.UserRole) 
        items.append(item) 
       self.model.appendRow(items) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 150, 600, 400) 
    window.show() 
    sys.exit(app.exec_()) 
0

Ekhumoroが示唆しているように、Excelデータの並べ替えはPandasで最も簡単です。私はopenpyxlと同様の操作を試みましたが、あまりにも制限されています。パンダは多くのコード行を保存できます。

小さな例:あなたは、このコードで実現しようとしているものをより明確に説明してください、そしてどのような具体的な、http://pbpython.com/excel-pandas-comp.htmlhttp://chrisalbon.com/python/pandas_indexing_selecting.htmlhttp://chrisalbon.com/python/pandas_dropping_column_and_rows.htmlhttp://chris.friedline.net/2015-12-15-rutgers/lessons/python2/02-index-slice-subset.html

関連する問題