我有一个包含两列时间数据的.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};
有人可以帮我弄清楚出了什么问题吗?
答案 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
或重塑数据before和after将其传递给datenum
来解决此问题:
t = cellfun(@datenum, M{1});
% Or...
t = reshape(datenum(M{1}(:)), size(M{1}));