在MATLAB中将日期时间转换为数字时出错

在MATLAB中将日期时间转换为数字时出错,matlab,datetime,file-io,Matlab,Datetime,File Io,我有一个.csv文件,其中包含两列时间数据。我想将其转换为日期编号,但出现以下错误: ??? Error using ==> datenum at 174 DATENUM failed. Error in ==> Interpolasi_Suhu_dan_waktu_16_02_17 at 21 t = datenum(M{1}); Caused by: Error using ==> dtstr2dtvecmx The input cell array m

我有一个.csv文件,其中包含两列时间数据。我想将其转换为日期编号,但出现以下错误:

??? Error using ==> datenum at 174
DATENUM failed.

Error in ==> Interpolasi_Suhu_dan_waktu_16_02_17 at 21
t = datenum(M{1});

Caused by:
    Error using ==> dtstr2dtvecmx
    The input cell array must be either a column or a row.
以下是.csv文件(Waktu_16_02_17.csv):

我使用的代码是:

fid = fopen('Waktu_16_02_17.csv', 'r');
M = textscan(fid, '%s %s', 'Delimiter', ',', 'CollectOutput', 1);
fclose(fid);

format short g
g = M{1};

有人能帮我找出哪里出了问题吗?

我仍然看不到您的CSV文件的正确格式(每个字符串后面是
\n
,是两个字符串还是只有一个长度?)。但是你的代码对我来说非常有效

我刚刚复制了您的数据并创建了新的.csv文件。它包含1个字符串。 因此,在使用您的代码后,我得到(使用
whos
命令):

接下来,让我们看看
M
的内部内容:

M{1}

ans =

  1×2 cell array

    '0:03:13 0:02:58 0:13:13 0:12:58 0:23:13 0:22:58 0:33:13 0:32:56 0:43:…'    ''
我们可以看到
M
有2个单元格。第一个包含来自csv的所有字符串数据,第二个为空。 好的,让我们输入csv中的
g
字符串:

g = M{1}{1} 
在您的代码中,您使用了
g=M{1}
,但要获取数据,我们需要做更深一层的工作。如果您的csv有另一种格式,您可以使用
M{1}
,文本扫描在
M
中返回结果字符串。 好的,现在
g
是一个包含191个字符符号的字符数组:所有日期和空格

现在您的问题是什么?
datenum
函数的数据类型不正确。可以对单元格数组使用
datenum
,但单元格数组必须是列的字符串。看起来您的
M{1}
数组是一个表(2个字符串和一些列)

就我而言,要对我的
g
char数组使用
datenum
,我必须这样做:

datenum(g(1:8))

ans =

    7.367e+05
这就是如何从数据中获取第一个日期的正确日期。要获得所有这些函数,只需将数组拆分为正确的部分(使用循环或
arrayfun
函数等)


希望有帮助

这里有两个问题,一个是使用的问题,另一个是使用的问题

您将文件称为.csv(逗号分隔值的缩写),但根据显示的示例数据,它不会显示为逗号用作分隔符。它似乎由空格分隔,这是
textscan
使用的空格,因此我将尝试以下方法:

fid = fopen('Waktu_16_02_17.csv', 'r');
M = textscan(fid, '%s %s', 'CollectOutput', 1);
fclose(fid);
假设数据加载正确,
M{1}
将包含一个N×2单元数组。
datenum
函数有一个限制,即它只能是一维单元格数组,而
M{1}
是二维单元格数组。您可以通过使用或重塑数据并将其传递给
datenum
来解决此问题:

t = cellfun(@datenum, M{1});
% Or...
t = reshape(datenum(M{1}(:)), size(M{1}));
fid = fopen('Waktu_16_02_17.csv', 'r');
M = textscan(fid, '%s %s', 'CollectOutput', 1);
fclose(fid);
t = cellfun(@datenum, M{1});
% Or...
t = reshape(datenum(M{1}(:)), size(M{1}));