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

时间:2017-09-12 06:11:37

标签: 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 must be either a column or a row.

这是.csv文件(Waktu_16_02_17.csv):

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:13 0:42:58
0:48:11 0:57:59
0:58:13 1:07:59
1:08:13 1:17:59
1:18:13 1:27:59
1:28:14 1:37:57
1:38:14 1:52:59
1:44:31 2:02:57

我使用的代码是:

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

format short g
g = M{1};

有人可以帮我弄清楚出了什么问题吗?

2 个答案:

答案 0 :(得分:0)

我仍然无法看到您的CSV文件格式正确(在每个字符串之后是\n吗?是2个字符串还是只有1个字符串?)。但是你的代码对我来说非常适合。

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

Name      Size           Bytes  Class     Attributes

  M         1x1            718  cell 

接下来,让我们看看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是一个char数组,包含191个char符号:所有日期和空格。

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

在我的情况下使用datenum作为我的g char数组我必须这样:

datenum(g(1:8))

ans =

    7.367e+05

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

希望它有所帮助!

答案 1 :(得分:0)

这里有两个问题,一个使用textscan,一个使用datenum

您将文件称为.csv(“逗号分隔值”的缩写),但似乎不会将逗号用作基于您显示的示例数据的分隔符。它似乎被空格分隔,这是textscan使用的default delimiter,所以我试试这个:

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

假设数据已正确加载,M{1}将包含N-by-2单元格数组。 datenum函数有一个限制,即DateString input只能是1-D单元阵列,而M{1}是2-D单元阵列。您可以使用cellfun或重塑数据beforeafter将其传递给datenum来解决此问题:

t = cellfun(@datenum, M{1});
% Or...
t = reshape(datenum(M{1}(:)), size(M{1}));