1

我有一个 .csv 文件,其中包含以下形式的记录:

2010-04-20 15:15:00,"8.9915176259e+00","8.8562623697e+00"
2010-04-20 15:30:00,"8.5718021723e+00","8.6633827160e+00"
2010-04-20 15:45:00,"8.4484844117e+00","8.4336586330e+00"
2010-04-20 16:00:00,"1.1106980342e+01","8.4333062208e+00"
2010-04-20 16:15:00,"9.0643470589e+00","8.6885660103e+00"
2010-04-20 16:30:00,"8.2133517943e+00","8.2677822671e+00"
2010-04-20 16:45:00,"8.2499419380e+00","8.1523501983e+00"
2010-04-20 17:00:00,"8.2948492278e+00","8.2884797924e+00"

从这些数据中,我想制作集群 - 我想添加一个带有数字的列,表示小时 - 所以在第一行的情况下,必须在新行中添加值 15。

第一个问题是调用函数

[numData, textData, rawData] = xlsread('testData.csv')

创建一个空矩阵 numData 和一列 textData 和 rawData 结构。

是否可以从上述数据中创建任何识别 yyyy、MM、dd、hh、mm、ss 值的模板?

我基本上想对这些数据做的是按小时对值进行分类,因此从输入的示例行中:

2010-04-20 15:15:00,"8.9915176259e+00","8.8562623697e+00"

更新 1:在 Matlab 中,上面的行被识别为字符串:

'2010-04-26 13:00:00,"1.0428104753e+00","2.3456394130e+00"'

我希望这是输出:

15, 8.9915176259e+00, 8.8562623697e+00

更新1:必须解析一个字符串

有谁知道如何解析字符串并从中检索时间戳 ('2010-04-20 15:15:00')、value1 (1.0428104753e+00) 和 value2 (2.3456394130e+00) 作为单独的值?

4

4 回答 4

2

如果我将XLSREAD与您的示例文件数据一起使用,我会像yuk 一样得到正确的输出。XLSREAD文档中的此声明可能会解释您遇到的问题:

如果您的系统没有安装 Excel for Windows,或者 MATLAB 无法访问 COM 服务器,xlsread 则以基本模式运行。在此模式下, xlsread仅读取 XLS 文件。

作为替代方案,我还能够使用TEXTSCAN读取您的示例数据文件:

>> fid = fopen('testData.csv','r');                    %# Open the file
>> data = textscan(fid,'%s %s %s','Delimiter',',',...  %# Read the data
                   'CollectOutput',true);
>> fclose(fid);                                        %# Close the file
>> data = strrep(data{1},'"','')  %# Format the data and remove '"'

data = 

    '2010-04-20 15:15:00'    '8.9915176259e+00'    '8.8562623697e+00'
    '2010-04-20 15:30:00'    '8.5718021723e+00'    '8.6633827160e+00'
    '2010-04-20 15:45:00'    '8.4484844117e+00'    '8.4336586330e+00'
    '2010-04-20 16:00:00'    '1.1106980342e+01'    '8.4333062208e+00'
    '2010-04-20 16:15:00'    '9.0643470589e+00'    '8.6885660103e+00'
    '2010-04-20 16:30:00'    '8.2133517943e+00'    '8.2677822671e+00'
    '2010-04-20 16:45:00'    '8.2499419380e+00'    '8.1523501983e+00'
    '2010-04-20 17:00:00'    '8.2948492278e+00'    '8.2884797924e+00'

现在,您可以使用DATEVECCELLFUNSTR2NUM将元胞数组中的字符串格式化data为数值矩阵:

>> dateVectors = datevec(data(:,1));  %# Format the date string
>> newData = [dateVectors(:,4) cellfun(@str2num,(data(:,2:3)))]

newData =                        %# A numeric matrix

   15.0000    8.9915    8.8563
   15.0000    8.5718    8.6634
   15.0000    8.4485    8.4337
   16.0000   11.1070    8.4333
   16.0000    9.0643    8.6886
   16.0000    8.2134    8.2678
   16.0000    8.2499    8.1524
   17.0000    8.2948    8.2885
于 2010-05-20T15:26:16.180 回答
1
datevec('2010-04-20 15:15:00')
ans =

        2010           4          20          15          15           0

其他两列的 str2num 和 csvwrite 也将是您的朋友。

我不确定我是否理解您的所有问题,但我怀疑这会让您顺利解决问题。

于 2010-05-20T14:19:09.247 回答
0

您可以使用DATEVEC将日期字符串转换为年、月、日、小时、分钟和秒。

DV = datevec(textData)

DV =

        2010           4          20          15          15           0
        2010           4          20          15          30           0
        2010           4          20          15          45           0
        2010           4          20          16           0           0
        2010           4          20          16          15           0
        2010           4          20          16          30           0
        2010           4          20          16          45           0
        2010           4          20          17           0           0

Hours = DV(:,4);

编辑

如果我使用(R2010a)您的示例数据和您的代码

[numData, textData, rawData] = xlsread('testData.csv')

我在 numData 中得到最后两列,在 textData 中得到第一列。将 DATEVEC 应用于 textData 会将日期字符串转换为数字。

编辑2

要解析您的字符串,您可以执行以下操作,例如:

s = '2010-04-20 15:15:00,"8.9915176259","8.8562623697"';
s2 = regexprep(s,'"','');
A = textscan(s2,'%s %f %f','Delimiter',',');
DV = datevec(A{1});
result = [DV(4) A{2:3}];
于 2010-05-20T14:21:55.367 回答
0

使用 http://www.mathworks.com/matlabcentral/fileexchange/19707-xls2struct

并假设您的 .csv 文件有一个“标题”行。我在这个例子中使用了 (time, v1, v2):

 data=xls2struct('t.csv');
 timeVec = datevec(data.time);
 data.time = timeVec(:,4); %replace time with hours
 matData=[data.time, data.v1,data.v2] %concat data from the struct

matData =

   15.0000    8.9915    8.8563
   15.0000    8.5718    8.6634
   15.0000    8.4485    8.4337
   16.0000   11.1070    8.4333
   16.0000    9.0643    8.6886
   16.0000    8.2134    8.2678
   16.0000    8.2499    8.1524
   17.0000    8.2948    8.2885
于 2010-05-20T15:00:18.447 回答