我有时间序列,而时间以datenum
格式存储。 datenum
向量由datetime
向量构建,格式为"dd-MMM-yyy HH:MM:SS
"。由于我的数据频率为1分钟,因此我每天需要1440个数据点和相应的时间。但是,有些日子有几个数据点丢失(通常不超过5个),我需要手动填写。
因此,我有以下问题:
如何从时间序列中获取每日数据(我已尝试仅使用基于日期的getsampleusingtime
unique date values
},但这不会起作用。
如何根据每天的时间序列中的datenum
时间识别缺失值,然后使用数据点插入相应的时间" 0"?
我感谢任何帮助!
答案 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);