【问题标题】:Matlab insert missing data into timeseries objectMatlab将丢失的数据插入时间序列对象
【发布时间】:2016-04-21 03:37:21
【问题描述】:

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

因此,我有以下问题:

  1. 如何从时间序列中获取每日数据(我曾尝试仅根据日期使用 getsampleusingtimeunique date values,但这不起作用)。

  2. 如何根据我的时间序列中每天的 datenum 时间识别缺失值,然后插入带有数据点“0”的相应时间?

感谢您的帮助!

【问题讨论】:

    标签: matlab time-series


    【解决方案1】:

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

    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 分钟的 delta 并搜索所有差值较大的值。

    % 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2014-01-13
      • 2020-04-12
      • 1970-01-01
      • 2022-01-22
      • 2019-03-14
      相关资源
      最近更新 更多