PyQt: How to sort QTableView columns of a excel file(strings and numericals and datetype)

前端 未结 2 1250
悲&欢浪女
悲&欢浪女 2021-01-27 16:10

This is a follow up question to: PyQt: How to sort QTableView columns(strings and numericals)

Now I am planning to do the same sorting for the excel files

Here i

相关标签:
2条回答
  • 2021-01-27 16:50

    Below is a demo script which reads both csv and excel files, and should sort dates, ints, floats, and strings correctly.

    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 讨论(0)
  • 2021-01-27 16:50

    As Ekhumoro suggests, sorting of Excel data is easiest done with Pandas. I have tried similar operations with openpyxl, but it's too limited. Pandas can save you many lines of code.

    A small example:

    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)
    

    Here are some nice links:

    • http://pbpython.com/excel-pandas-comp.html
    • http://chrisalbon.com/python/pandas_indexing_selecting.html
    • http://chrisalbon.com/python/pandas_dropping_column_and_rows.html
    • http://chris.friedline.net/2015-12-15-rutgers/lessons/python2/02-index-slice-subset.html
    0 讨论(0)
提交回复
热议问题