在MatLab中缩放日期

时间:2014-02-28 10:27:02

标签: matlab date scaling

我有两组数据:一组每天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 个答案:

答案 0 :(得分:1)

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

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

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

修改

如果您将前两个字段组合在一起,要提供类似15/01/201400:03:15的输入字符串,那么您可以通过以下方式获得datenum

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

答案 1 :(得分: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

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