Octave 中的 datenum 问题
Trouble with datenum in Octave
我试图通过首先使用 datenum 解析一些数据来使用 datetick 函数绘制一些数据。这是我尝试读取的一些数据:
0, 6/23/2015 12:21:590 PM, 93.161, 95.911,94.515,95.917, -5511.105,94.324,-1415.849,2.376,2.479
1, 6/23/2015 12:22:02 PM, 97.514, 96.068,94.727,96.138,-12500.000,94.540,-8094.912,2.386,2.479
我试试下面的代码:
fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);
fclose(fileID);
formatIn = 'mm/dd/yyyy HH:MM:SS.FFF PM';
m = datenum(C{2},formatIn)
figure('Position',[0,0,1000,1000])
h1 = plot(m,C{5},'b');
datetick (formatIn);
我收到以下错误:
error: datevec: DATE not parsed correctly with given format
error: called from
datevec at line 147 column 11
datenum at line 104 column 40
plotwithdate at line 18 column 3
我可以通过使用以下方法将 month/day/year 与时间和 AM/PM 分开来使 datenum 部分工作:
fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %s %s %f %f %f %f %f %f %f %f','Delimiter',', ','headerLines', 9);
fclose(fileID);
m = datenum(C{2},'mm/dd/yyyy')
n = datenum(C{3},'HH:MM:SS.FFF')
o = datenum(C{4},'AM')
这为我提供了 m、n 和 o 的每一行的 7xxxxx 数字。所以语法看起来没问题,直到我一起尝试它们。
代码有两个问题。
首先,您的格式字符串与列数不匹配。你需要一个额外的 %f
在那里。就目前而言,您的代码会产生:
C{2}
ans =
{
[1,1] = 6/23/2015 12:21:590 PM
[2,1] = 1
[3,1] = 2.479
}
因此,第一个解决方法是向 textread 格式字符串添加一个额外的 %f
:
C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);
产生:
C{2}
ans =
{
[1,1] = 6/23/2015 12:21:590 PM
[2,1] = 6/23/2015 12:22:02 PM
}
现在,接下来您会注意到 12:21:590
是错误的。我假设这只是您示例中的错字。但是设置为 12:21:59
仍然存在问题。
您指定了一种包含小数秒的格式,但您的数据不包含小数秒。 Octave 会因此抛出错误。如果您指定 .FFF
,您的数据需要包含它,即使它只是 .0
.
最后,Octave 仍然会抛出错误,即使您将小数秒添加到数据中也是如此。然而,这不是你的错。每当 .FFF
和 PM
符号一起使用时,Octave 中似乎存在错误。例如:
>> datevec('06/01/2015 3:07:12 PM','mm/dd/yyyy HH:MM:SS PM')
ans =
2015 6 1 15 7 12
>> datevec('06/01/2015 3:07:12.123','mm/dd/yyyy HH:MM:SS.FFF')
ans =
2015.0000 6.0000 1.0000 3.0000 7.0000 12.1230
>> datevec('06/01/2015 3:07:12.123 PM','mm/dd/yyyy HH:MM:SS.FFF PM')
error: datevec: DATE not parsed correctly with given format
error: called from
datevec at line 147 column 11
Octave 的 bug report 中涵盖了此问题。当前有一个更正版本的函数 datevec.m 文件附加到该错误报告。根据该页面上的信息,更正后的功能将成为 Octave 4.0.1 发布时的一部分。同时,您可以下载并使用更正后的版本来正确处理您的数据。
或者,如果您可以控制源数据格式,则可以删除 .FFF
指示符(看起来您的数据可能根本不需要它),或者删除 PM
,以及它会起作用。
更新:上述错误已修复并关闭。 Octave 4.0.1以后的版本应该不会再有这个问题了。
我试图通过首先使用 datenum 解析一些数据来使用 datetick 函数绘制一些数据。这是我尝试读取的一些数据:
0, 6/23/2015 12:21:590 PM, 93.161, 95.911,94.515,95.917, -5511.105,94.324,-1415.849,2.376,2.479
1, 6/23/2015 12:22:02 PM, 97.514, 96.068,94.727,96.138,-12500.000,94.540,-8094.912,2.386,2.479
我试试下面的代码:
fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);
fclose(fileID);
formatIn = 'mm/dd/yyyy HH:MM:SS.FFF PM';
m = datenum(C{2},formatIn)
figure('Position',[0,0,1000,1000])
h1 = plot(m,C{5},'b');
datetick (formatIn);
我收到以下错误:
error: datevec: DATE not parsed correctly with given format
error: called from
datevec at line 147 column 11
datenum at line 104 column 40
plotwithdate at line 18 column 3
我可以通过使用以下方法将 month/day/year 与时间和 AM/PM 分开来使 datenum 部分工作:
fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %s %s %f %f %f %f %f %f %f %f','Delimiter',', ','headerLines', 9);
fclose(fileID);
m = datenum(C{2},'mm/dd/yyyy')
n = datenum(C{3},'HH:MM:SS.FFF')
o = datenum(C{4},'AM')
这为我提供了 m、n 和 o 的每一行的 7xxxxx 数字。所以语法看起来没问题,直到我一起尝试它们。
代码有两个问题。
首先,您的格式字符串与列数不匹配。你需要一个额外的 %f
在那里。就目前而言,您的代码会产生:
C{2}
ans =
{
[1,1] = 6/23/2015 12:21:590 PM
[2,1] = 1
[3,1] = 2.479
}
因此,第一个解决方法是向 textread 格式字符串添加一个额外的 %f
:
C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);
产生:
C{2}
ans =
{
[1,1] = 6/23/2015 12:21:590 PM
[2,1] = 6/23/2015 12:22:02 PM
}
现在,接下来您会注意到 12:21:590
是错误的。我假设这只是您示例中的错字。但是设置为 12:21:59
仍然存在问题。
您指定了一种包含小数秒的格式,但您的数据不包含小数秒。 Octave 会因此抛出错误。如果您指定 .FFF
,您的数据需要包含它,即使它只是 .0
.
最后,Octave 仍然会抛出错误,即使您将小数秒添加到数据中也是如此。然而,这不是你的错。每当 .FFF
和 PM
符号一起使用时,Octave 中似乎存在错误。例如:
>> datevec('06/01/2015 3:07:12 PM','mm/dd/yyyy HH:MM:SS PM')
ans =
2015 6 1 15 7 12
>> datevec('06/01/2015 3:07:12.123','mm/dd/yyyy HH:MM:SS.FFF')
ans =
2015.0000 6.0000 1.0000 3.0000 7.0000 12.1230
>> datevec('06/01/2015 3:07:12.123 PM','mm/dd/yyyy HH:MM:SS.FFF PM')
error: datevec: DATE not parsed correctly with given format
error: called from
datevec at line 147 column 11
Octave 的 bug report 中涵盖了此问题。当前有一个更正版本的函数 datevec.m 文件附加到该错误报告。根据该页面上的信息,更正后的功能将成为 Octave 4.0.1 发布时的一部分。同时,您可以下载并使用更正后的版本来正确处理您的数据。
或者,如果您可以控制源数据格式,则可以删除 .FFF
指示符(看起来您的数据可能根本不需要它),或者删除 PM
,以及它会起作用。
更新:上述错误已修复并关闭。 Octave 4.0.1以后的版本应该不会再有这个问题了。