Импорт и изменение данных даты в MATLAB - PullRequest
1 голос
/ 20 мая 2010

У меня есть файл .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 с одним столбцом.

Можно ли создать какой-либо шаблон, который распознает значения гггг, мм, дд, чч, мм, сс из приведенных выше данных?

Что я в основном хотел бы сделать с этими данными, так это классифицировать значения по часам, поэтому из строки ввода примера:

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 ]

2 голосов
/ 20 мая 2010

Если я использую XLSREAD с вашими данными файла примера, я получаю правильные выходные данные, как yuk сделал . Это утверждение из документации для XLSREAD может объяснить возникшую проблему:

Если в вашей системе нет Excel для 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'

Теперь вы можете отформатировать строки в массиве ячеек 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
1 голос
/ 20 мая 2010
datevec('2010-04-20 15:15:00')
ans =

        2010           4          20          15          15           0

str2num для двух других столбцов, и csvwrite также будет вашим другом.

Я не уверен, что понимаю все ваши вопросы, но я подозреваю, что это поможет вам на пути к решению.

0 голосов
/ 20 мая 2010

с помощью 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
0 голосов
/ 20 мая 2010

Вы можете использовать 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);

EDIT

Если я использую (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}];
...