代码之家  ›  专栏  ›  技术社区  ›  Niko Gamulin

在Matlab中导入和修改日期数据

  •  1
  • Niko Gamulin  · 技术社区  · 14 年前

    我有一个.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”)、值1(1.0428104753e+00)和值2(2.3456394130e+00)作为单独的值吗?

    4 回复  |  直到 9 年前
        1
  •  2
  •   Community WizardZ    7 年前

    如果我使用 XLSREAD 使用您的示例文件数据,我得到了正确的输出,就像 yuk did . 本声明来自以下文件: XLSSRADE 可以解释您遇到的问题:

    如果您的系统没有Excel Windows已安装,或Matlab无法 访问COM服务器, xlsread 在基本模式下工作。在这种模式下, XLSSRADE 只读取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'
    

    现在可以格式化单元数组中的字符串 data 在数值矩阵中使用 DATEVEC , CELLFUN STR2NUM :

    >> 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
  •  1
  •   MatlabDoug    14 年前
    datevec('2010-04-20 15:15:00')
    ans =
    
            2010           4          20          15          15           0
    

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

    我不确定我是否理解你所有的问题,但我怀疑这会让你在解决问题的过程中受益匪浅。

        3
  •  0
  •   Ashish Uthama    14 年前

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

    假设你的.csv文件有一个“header”行。我在这个例子中使用了(时间,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
  •  0
  •   yuk    14 年前

    你可以使用 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}];