如何一次将表列转换为所需类型?

时间:2019-12-03 21:28:33

标签: matlab type-conversion

我有一个使用table读取到readtable变量的csv文件。因此,所有列均为包含字符串值的cell类型。实际数据的类型为doubleint32datetimelogicalstring。我正在逐列转换它们。我想转换相同类型的特定列,或者一次转换所有列。有可能吗?

这里是我现在正在做的示例,但是我的表有63列:

clear variables;
%% simulate readtable
C = {...
'34145823','2015-12-08 00:15:55','3.2','1';
'34157170','2015-12-08 13:29:30','0.5','0';
'34157958','2015-12-08 14:07:00','-1.7','1'};
T = table(C(:, 1), C(:, 2), C(:, 3), C(:, 4), ...
    'variablenames', {'int32Col', 'datetimeCol', 'doubleCol', 'logicalCol'});
varfun(@class, T, 'OutputFormat', 'cell')
%% type conversion
T.int32Col = int32(str2double(T.int32Col));
T.datetimeCol = datetime(T.datetimeCol);
T.doubleCol = str2double(T.doubleCol);
T.logicalCol = cell2mat(T.logicalCol) == '1';
varfun(@class, T, 'OutputFormat', 'cell')
T

附言::这些csv文件中的所有值都包含在"之间,这就是为什么它们被读取为字符串的原因。

1 个答案:

答案 0 :(得分:2)

我认为您至少必须指定每一列的数据类型,但是一旦完成,switch语句将使您可以遍历各列,而不必一一遍历。

我引入了varNames作为每列的名称---我想您可以从csv文件中获得此名称。我还介绍了varTypes,它是每一列的数据类型,我认为您必须手工制作它,也许您可​​以根据实际的csv文件将其自动化。

clear variables;
% simulate readtable
C = {...
    '34145823','2015-12-08 00:15:55','3.2','1';
    '34157170','2015-12-08 13:29:30','0.5','0';
    '34157958','2015-12-08 14:07:00','-1.7','1'};
varNames = {'int32Col', 'datetimeCol', 'doubleCol', 'logicalCol'};
T = table(C(:, 1), C(:, 2), C(:, 3), C(:, 4), ...
    'variablenames', varNames);

varTypes = {'int32' 'date' 'double' 'logical'};
for i = 1:size(T,2)
    switch varTypes{i}
        case 'int32'
            T.(varNames{i}) = int32(str2double(T{:,i}));
        case 'date'
            T.(varNames{i}) = datetime(T{:,i});
        case 'double'
            T.(varNames{i}) = str2double(T{:,i});
        case 'logical'
            T.(varNames{i}) = logical(cell2mat(T{:,i}));
    end
end