【问题标题】:Matlab/Octave - parsing and plotting date string vs. integerMatlab/Octave - 解析和绘制日期字符串与整数
【发布时间】:2020-07-16 13:59:53
【问题描述】:

我有一个数据文件,第一列为日期字符串,第二列为整数:

"2020/02/29" 1
"2020/03/03" 2
"2020/03/04" 6

我想解析这个文件并在 x 轴上绘制日期,在 y 轴上绘制整数。我最近失败的尝试是:

file_name = "data.dat";
fid = fopen(file_name, 'rt');
raw_data = textscan(fid, "%s %d");
fclose(fid);

graphics_toolkit('gnuplot');
plot(raw_data(:, 1), raw_data(:, 2));

图表为空,没有可显示的数据。如何正确绘制此类数据? textscan 的输出似乎有点难以绘图。

【问题讨论】:

    标签: plot octave


    【解决方案1】:

    您不能绘制字符串,您必须先将日期字符串转换为日期数字。使用cellfun 有效地做到这一点

    x=cellfun(@(d) datenum(regexprep(d,'"',''),'yyyy/mm/dd'), raw_data{1});
    y=raw_data{2};
    plot(x,y)
    

    【讨论】:

    • 嗯,这似乎搞砸了日期。前两个日期数字是 7.3782e+005 和 7.3779e+005,即第一个大于第二个,即使第一个日期在第二个之前
    • 已修复,问题是我使用了 'YYYY/MM/DD' 格式,而应该是 'yyyy/mm/dd'。修复后,它可以按您的意愿工作。
    【解决方案2】:

    这将是我的做法。

    pkg load io
    
    Data   = csv2cell( 'data', ' ' );
    Rows   = size( Data, 1 );
    
    Datestrings = cell( Rows, 1 );
    Datenums    = zeros( Rows, 1 );
    Values      = zeros( Rows, 1 );
    
    for i = 1 : Rows
      Datestrings{i} = Data{ i, 1 };
      Datenums(i)    = datenum( Data{ i, 1 }, 'yyyy/mm/dd' );
      Values(i)      = Data{ i, 2 };
    end
    
    plot( Datenums, Values );
    set( gca, 
         'xtick', Datenums, 
         'xticklabel', Datestrings
    );
    

    我也会添加一个 xticklabelrotation 选项,但是根据手册,xticklabelrotation 尚未在当前 octave (5.2.0) 中实现,因此添加它不会做任何事情。

    【讨论】:

    • 还有独立的 strftime 和 strptime 函数,如果你更熟悉的话,它们使用的语法更类似于 python 的 datetime。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2018-04-01
    • 2019-02-15
    • 2014-02-18
    相关资源
    最近更新 更多