def setData(self, index, value, role=DTYPE_CHANGE_ROLE): """Updates the datatype of a column. The model must be initated with a dataframe already, since valid indexes are necessary. The `value` is a translated description of the data type. The translations can be found at `pandasqt.translation.DTypeTranslator`. If a datatype can not be converted, e.g. datetime to integer, a `NotImplementedError` will be raised. Args: index (QtCore.QModelIndex): The index of the column to be changed. value (str): The description of the new datatype, e.g. `positive kleine ganze Zahl (16 Bit)`. role (Qt.ItemDataRole, optional): The role, which accesses and changes data. Defaults to `DTYPE_CHANGE_ROLE`. Raises: NotImplementedError: If an error during conversion occured. Returns: bool: `True` if the datatype could be changed, `False` if not or if the new datatype equals the old one. """ if role != DTYPE_CHANGE_ROLE or not index.isValid(): return False if not self.editable(): return False self.layoutAboutToBeChanged.emit() dtype = SupportedDtypes.dtype(value) currentDtype = np.dtype(index.data(role=DTYPE_ROLE)) if dtype is not None: if dtype != currentDtype: col = index.column() #row = self._dataFrame.columns[index.column()] columnName = self._dataFrame.columns[index.row()] try: if dtype == np.dtype('<M8[ns]'): self._dataFrame[columnName] = self._dataFrame[columnName].apply(pandas.to_datetime) else: self._dataFrame[columnName] = self._dataFrame[columnName].astype(dtype) self.dtypeChanged.emit(index.row(), dtype) self.layoutChanged.emit() return True except Exception as e: message = 'Could not change datatype %s of column %s to datatype %s' % (currentDtype, columnName, dtype) self.changeFailed.emit(message) # self._dataFrame[columnName] = self._dataFrame[columnName].astype(currentDtype) # self.layoutChanged.emit() # self.dtypeChanged.emit(columnName) #raise NotImplementedError, "dtype changing not fully working, original error:\n{}".format(e) return False
def accept(self): super(AddAttributesDialog, self).accept() newColumn = self.columnNameLineEdit.text() dtype = SupportedDtypes.dtype(self.dataTypeComboBox.currentText()) defaultValue = self.defaultValueLineEdit.text() try: if dtype in SupportedDtypes.intTypes() + SupportedDtypes.uintTypes(): defaultValue = int(defaultValue) elif dtype in SupportedDtypes.floatTypes(): defaultValue = float(defaultValue) elif dtype in SupportedDtypes.boolTypes(): defaultValue = defaultValue.lower() in ['t', '1'] elif dtype in SupportedDtypes.datetimeTypes(): defaultValue = Timestamp(defaultValue) if isinstance(defaultValue, NaTType): defaultValue = Timestamp('') else: defaultValue = dtype.type() except ValueError, e: defaultValue = dtype.type()
def accept(self): super(AddAttributesDialog, self).accept() newColumn = self.columnNameLineEdit.text() dtype = SupportedDtypes.dtype(self.dataTypeComboBox.currentText()) defaultValue = self.defaultValueLineEdit.text() try: if dtype in SupportedDtypes.intTypes() + SupportedDtypes.uintTypes( ): defaultValue = int(defaultValue) elif dtype in SupportedDtypes.floatTypes(): defaultValue = float(defaultValue) elif dtype in SupportedDtypes.boolTypes(): defaultValue = defaultValue.lower() in ['t', '1'] elif dtype in SupportedDtypes.datetimeTypes(): defaultValue = Timestamp(defaultValue) if isinstance(defaultValue, NaTType): defaultValue = Timestamp('') else: defaultValue = dtype.type() except ValueError, e: defaultValue = dtype.type()