首页 文章

在MatLab中缩放日期

提问于
浏览
0

我有两组数据:一组每天120个数据点(10分钟记录间隔)和一组每天96个数据点(15分钟记录间隔) .

我已经有了一个功能性的matlab脚本来绘制24小时内具有相同点数的两个数据文件 . 问题是这个脚本依赖于每天标记x轴的点数 .

代码的主要部分如下:

data1=importdata(a);
data2=importdata(b);
data=data1.data(:,1);
Data=data2.data(:,1);
text=data1.textdata;
for i=1:length(data(:,1))
dates(i,:)=[str2num(text{i,1}(1:2)),str2num(text{i,1}(4:5)),str2num(text{i,1}(7:8))];
dates2(i,:)=text{i,1};
time(i,:)=[str2num(text{i,2}(1:2)),str2num(text{i,2}(4:5)),str2num(text{i,2}(7:8))];
time2(i,:)=text{i,2};
end


pH=data(:,1);
pH2=Data(:,1);
maxpH=max(data(:,1));
minpH=min(data(:,1));
h=figure;
set(h,'Position', [1 1 1200 565]);
subplot('Position',[0.08 0.09 0.87 0.8]);

hold on
set(gcf,'PaperPositionMode','auto');
plot(1:length(data(:,1)),acidosisthreshold*ones(1,length(data(:,1))),'r','linewidth',2);
plot(pH,'linewidth',1.5);
plot(pH2,'m','linewidth',1.5);
set(gca, 'XTick',1:pointsperday:length(dates), 'XTickLabel',dates2(1:pointsperday:length(dates(:,1)),:),'xlim',[0 length(dates)]);
xlabel('Time', 'FontSize',16);
ylabel('pH', 'FontSize',16);
title(['A plot of the pH over ',num2str(c),' days; group']);

如您所见,pointsperday变量是在x轴上设置比例的原因 . 我的问题是:我如何调整这个以适用于具有不同pointperday值的两个文件?

编辑:从csv文档读入数据 . 示例行将是:

15/01/2014 , 00:00:00 , 6.53 , -330 , 39.7 , 2.97

对应于:

DD/MM/YYYY , HH:MM:SS , pH , [other values are irrelevant ]

2 回答

  • 1

    如果不了解数据格式的详细信息,很难给出明确的建议 . 我在这种情况下通常做的是读取日期/时间字符串并使用 datenum() 转换为Matlab的内部表示 . 这通常对字符串格式非常聪明,如果需要,可以给它一个显式格式字符串 .

    然后可以使用 datenum 格式数据将数据绘制为 x 值 . 这与每个系列中各点之间的时间间隔无关 . 可以使用 datetick() 生成x刻度 .

    或者,您可以通过查找最早的数据点并从所有其他数据中减去 datenum 并将结果用作 x 值来工作 . 这为您提供了自数据开始以来的天数 .

    Edit:

    如果你将前两个字段连接起来,给出一个像 15/01/201400:03:15 这样的输入字符串,那么你可以通过以下方式获得 datenum

    timestamp = datenum(input_string, 'dd/mm/yyyyHH:MM:SS');
    
  • 0

    您可以使用以下代码,是的,它有点脏,但有效(基于我可以从您的输入信息中假设的输入数据) -

    %% Import data
    
    for i=1:length(data(:,1))
        dates(i,:)=[str2num(text{i,1}(1:2)),str2num(text{i,1}(4:5)),str2num(text{i,1}(7:8))];
        dates2(i,:)=text{i,1};
        time(i,:)=[str2num(text{i,2}(1:2)),str2num(text{i,2}(4:5)),str2num(text{i,2}(7:8))];
        time2(i,:)=text{i,2};
    end
    
    pH=data(:,1);
    pH2=Data(:,1);
    maxpH=max(data(:,1));
    minpH=min(data(:,1));
    h=figure;
    set(h,'Position', [1 1 1200 565]);
    subplot('Position',[0.08 0.09 0.87 0.8]);
    
    %% Correction needed to normalize sizes of pH and pH2
    ext_len = max(size(pH,1)*2,size(pH2,1)*3);
    
    a1 = NaN(ext_len,1);
    a2 = NaN(ext_len,1);
    
    a1(2:2:end) = pH;
    a2(3:3:end) = pH2;
    
    pH = a1;
    pH2 = a2;
    
    data=pH;
    
    dates1=NaN(ext_len,size(dates,2));
    dates1(2:2:end,:) = dates;
    dates=dates1;
    
    %% Continue plotting
    hold on
    set(gcf,'PaperPositionMode','auto');
    plot(1:length(data(:,1)),acidosisthreshold*ones(1,length(data(:,1))),'r','linewidth',2);
    plot(pH,'b.','linewidth',1.5);
    plot(pH2,'m.','linewidth',1.5);
    set(gca, 'XTick',1:pointsperday:length(dates), 'XTickLabel',dates2(1:pointsperday:length(dates(:,1)),:),'xlim',[0 length(dates)]);
    xlabel('Time', 'FontSize',16);
    ylabel('pH', 'FontSize',16);
    

    如您所见,我们需要标准化(即使pH和pH2的大小相同),并且中间数据必须用NaN填充 .

    此外,您可以看到绘图将使用点与默认行相比 . 如果你必须使用带有线条的情节,可以查看这个code .

    如果以上代码适合您,请告诉我们!

相关问题