【问题标题】:Import & modify date data in MATLAB在 MATLAB 中导入和修改日期数据
【发布时间】:2010-05-20 13:55:39
【问题描述】:

我有一个 .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) 作为单独的值?

【问题讨论】:

    标签: matlab csv file-io import-from-csv


    【解决方案1】:

    如果我将XLSREAD 与您的示例文件数据一起使用,我会得到与yuk did 一样的正确输出。 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
    

    【讨论】:

      【解决方案2】:
      datevec('2010-04-20 15:15:00')
      ans =
      
              2010           4          20          15          15           0
      

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

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

      【讨论】:

      • 对不起,Doug,还没有看到你的答案。
      • 在获得我想要的声望点之前,您可以随时删除您的答案! :)
      • 感谢 Doug 关于时间戳解析的回复。我已经提炼了一个关于字符串解析的问题,所以希望现在更清楚我想要做什么。
      【解决方案3】:

      使用 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
      

      【讨论】:

        【解决方案4】:

        您可以使用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 会将日期字符串转换为数字。

        EDIT2

        要解析你的字符串,你可以这样做,例如:

        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}];
        

        【讨论】:

        • 我尝试使用 xlsread 但 numData 再次为空,而 rawData 和 textData 是 2857x1 结构(文件中有 2857 条记录)。
        • s2 = '2010-04-20 15:15:00,8.9915176259e+00,8.8562623697e+00' >> A = textscan(s2,'%s %f %f','分隔符',','); ???使用 ==> textscan 时出错 第一个输入必须是 double 或 string 类型。
        • 因为您将 textscan 应用于字符串元胞数组。如果 xlsread 没有按预期工作,我会使用 textscan 读取文件,但您已经从 gnovice 获得了答案。
        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        相关资源
        最近更新 更多