Matlab将缺少的数据插入到timeseries对象中

时间:2016-01-15 14:06:40

标签: matlab time-series

我有时间序列,而时间以datenum格式存储。 datenum向量由datetime向量构建,格式为"dd-MMM-yyy HH:MM:SS"。由于我的数据频率为1分钟,因此我每天需要1440个数据点和相应的时间。但是,有些日子有几个数据点丢失(通常不超过5个),我需要手动填写。

因此,我有以下问题:

  1. 如何从时间序列中获取每日数据(我已尝试仅使用基于日期的getsampleusingtime unique date values},但这不会起作用。

  2. 如何根据每天的时间序列中的datenum时间识别缺失值,然后使用数据点插入相应的时间" 0"?

  3. 我感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

考虑以下示例(没有很好地编程......):

clc; clear;

time = {};

% Sample time series
for d = 1:3
    for h = 0:23
        if h < 10
            hstr = ['0' num2str(h)];
        else
            hstr = num2str(h);
        end
        for m = 0:59
            if m < 10
                mstr = ['0' num2str(m)];
            else
                mstr = num2str(m);
            end
            time{end+1,1} = ['0' num2str(d) '-01-2016 ' hstr ':' mstr ':00'];
        end
    end
end

% Missing times
time([10 2000]) = [];

input_format = 'dd-MM-yyyy HH:mm:ss';

num = datenum(datetime(time,'InputFormat',input_format));

如果您计算当天开始的datenum和第二天的开始,您现在可以检查特定日期的值。中间的所有值都属于所选日期。

% Check for second day (1.)
test1 = '02-01-2016 00:00:00';
test2 = '03-01-2016 00:00:00';

num1 = datenum(datetime(test1,'InputFormat',input_format));
num2 = datenum(datetime(test2,'InputFormat',input_format));

% Find all in one day
r = num>=num1 & num<num2;

day2 = num(r); % Only the values from the second day.

要查找缺失值,您可以计算1分钟的增量并搜索差异较大的所有值。

% Find missing values (2.)
test1 = '01-01-2016 00:00:00';
test2 = '01-01-2016 00:01:00';

num1 = datenum(datetime(test1,'InputFormat',input_format));
num2 = datenum(datetime(test2,'InputFormat',input_format));

delta = num2-num1;

% Find missing values
pos = find(diff(num) > delta*1.1); % To avoid numerical issues

注意,第二个示例仅在使用所有秒的相同值时才有效(如我的情况00)。

编辑:

另一种选择是直接使用datetime结构。

dates = datetime(time,'InputFormat',input_format);

% 1.
day2 = find([dates.Day] == 2);

% 2.
pos = find(diff([dates.Minute])>1);