在MATLAB中将日期时间转换为数字时出错
我有一个.csv文件,其中包含两列时间数据。我想将其转换为日期编号,但出现以下错误:在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
??? 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}));