【问题标题】:Matlab regexp split time array and save time output for plottingMatlab 正则表达式拆分时间数组并节省时间输出以进行绘图
【发布时间】:2014-02-11 16:14:09
【问题描述】:

我正在尝试遍历 matlab 中的日期/时间数组,使用带有以下分隔符('/' 或 ':' 或 '.')的正则表达式拆分每一列,并将每一列分别存储为年份,日、时、分、秒、秒。最终,我试图将这个 Julian 日期和时间数组转换为 matlab 中的 plot 格式。到目前为止,我已经能够遍历我的名为“time”的数组并创建了一个名为“clean2_time”的新 1x6 单元格,它根据分隔符将每一行分成 6 列(年、日、小时、分钟、秒、ss) '/' ':' 和 '。'。我的问题是循环每次迭代都会覆盖“clean2_time”,我只剩下最后一行的最终 1x6 时间戳。我尝试创建一个全为零的新变量'z'并将'clean2_time'设置为z,但没有运气。

“时间”示例:

'2013/231/21:38:09.856619'
'2013/231/21:38:09.955640'
'2013/231/21:38:10.156685'
'2013/231/21:38:10.356550'
'2013/231/21:38:10.556770'
'2013/231/21:38:10.756565'
'2013/231/21:38:10.955627'
'2013/231/21:38:11.256588'
'2013/231/21:38:11.556649'
'2013/231/21:38:11.955597'
'2013/231/21:38:12.356627'
'2013/231/21:38:12.856557'
'2013/231/21:38:13.356558'
'2013/231/21:38:14.156530'
'2013/231/21:38:14.970500'
'2013/231/21:38:16.256545'
'2013/231/21:38:16.266736'
'2013/231/21:38:18.156398'

到目前为止我尝试过的代码:

z=zeros(size(time,1),6);
for i = 1:size(time,1)  % for i = 1 to 5922
    clean2_time = regexp(time{i,1}, '[/:.]', 'split');
    z{i,1} = clean2_time(i,1)
    z{i,2} = clean2_time(i,2)
    z{i,3} = clean2_time(i,3)
    z{i,4} = clean2_time(i,4)
    z{i,5} = clean2_time(i,5)
    z{i,6} = clean2_time(i,6)
end

【问题讨论】:

    标签: matlab sorting time delimiter


    【解决方案1】:

    您在正确的轨道上,但是,您不需要 for 循环。

    只需这样做就足够了:

    clean2_time=regexp(time, '[/:.]', 'split');
    

    那么clean2_time 是一个单元结构,其中每一行都包含另一个 1x6 单元阵列。然后,您可以使用:clean2_time{row}{column} 访问不同的值。如果您真的希望 clean2_time 成为一个 nx6 数值矩阵而不是这个字符串元胞数组,只需使用它来重塑:

    clean2_time=cellfun(@str2num,vertcat(clean2_time{:}))
    

    【讨论】:

    • 这很好,但我只是注意到 'clean2_time=cellfun(@str2num,vertcat(clean2_time{:}))' 删除微秒列中的最后一个零(如果有一个)。这不起作用,因为我最终想绘制这个日期/时间。你能帮我理解我应该如何绘制这个吗?
    • 这不是我的情况。使用您提供的数据,所有行都以零结尾,对我来说仍然以零结尾。
    • 对不起,你是对的,它是微秒列中的前导零被删除,这是有道理的,因为你正在转换为数字。这将导致绘图时时间不正确。任何想法如何解决这个问题?我可以删除“。”作为分隔符之一,这可能会起作用。关于如何绘制儒略历日的任何想法(例如 2013/231 = 2013 年 8 月 19 日)?
    • 好的,所以如果您想将其保留为字符串而不是数字,只需将 clean2_time=cellfun(@str2num,vertcat(clean2_time{:})) 替换为 clean2_time=vertcat(clean2_time{:}),并使用 {} 括号进行索引。
    【解决方案2】:
    clean2_time=zeros(size(time,1),6);
    for i = 1:size(time,1)  % for i = 1 to 5922
        clean2_time(i,:)=regexp(time{i,1}, '[/:.]', 'split')
    end
    

    clean2_time(i,:) 索引单元格的第 i 行。

    【讨论】:

    • 您可以删除第一行。 z 不是您的解决方案所必需的。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多