如何重新采样时间矢量数据matlab

时间:2013-08-07 20:10:37

标签: matlab time-series interpolation

我必须重新采样以下单元格数组:

dateS = 

'2004-09-02 06:00:00'
'2004-09-02 07:30:00'
'2004-09-02 12:00:00'
'2004-09-02 18:00:00'
'2004-09-02 19:30:00'
'2004-09-03 00:00:00'
'2004-09-03 05:30:00'
'2004-09-03 06:00:00'

遵循不规则间距,例如在第1行和第2行之间有5个读数,而在2和3之间有10个。中间体“读数”的数量存储在向量“v”中。所以,我需要的是一个新的向量,其中所有的中间日期/时间都采用相同的格式在dateS。

修改

列表中前两个读数之间有1小时30分钟= 90分钟。五个间隔b / w它们相当于90分钟/ 5 = 18分钟。现在在(1)和(2)之间插入五个“读数”,每个读数相隔18分钟。我需要为所有日期做到这一点。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用interp1()

插入序列日期
% Inputs
dates = [
'2004-09-02 06:00:00'
'2004-09-02 07:30:00'
'2004-09-02 12:00:00'
'2004-09-02 18:00:00'
'2004-09-02 19:30:00'
'2004-09-03 00:00:00'
'2004-09-03 05:30:00'
'2004-09-03 06:00:00'];

v = [5 4 3 2 4 5 3];

% Serial dates
serdates  = datenum(dates,'yyyy-mm-dd HH:MM:SS');
% Interpolate
x         = cumsum([1 v]);
resampled = interp1(x, serdates, x(1):x(end))';

结果:

datestr(resampled)
ans =
02-Sep-2004 06:00:00
02-Sep-2004 06:18:00
02-Sep-2004 06:36:00
02-Sep-2004 06:54:00
02-Sep-2004 07:12:00
02-Sep-2004 07:30:00
02-Sep-2004 08:37:30
02-Sep-2004 09:45:00
02-Sep-2004 10:52:30
02-Sep-2004 12:00:00
02-Sep-2004 14:00:00
02-Sep-2004 16:00:00
02-Sep-2004 18:00:00
02-Sep-2004 18:45:00
02-Sep-2004 19:30:00
02-Sep-2004 20:37:30
02-Sep-2004 21:45:00
02-Sep-2004 22:52:30
03-Sep-2004 00:00:00
03-Sep-2004 01:06:00
03-Sep-2004 02:12:00
03-Sep-2004 03:18:00
03-Sep-2004 04:24:00
03-Sep-2004 05:30:00
03-Sep-2004 05:40:00
03-Sep-2004 05:50:00
03-Sep-2004 06:00:00

答案 1 :(得分:2)

以下代码执行您想要的操作(我为v选择了任意值 - 只要向量v中的元素数量少于dateS中的条目数量这应该工作):

dateS = [
'2004-09-02 06:00:00'
'2004-09-02 07:30:00'
'2004-09-02 12:00:00'
'2004-09-02 18:00:00'
'2004-09-02 19:30:00'
'2004-09-03 00:00:00'
'2004-09-03 05:30:00'
'2004-09-03 06:00:00'];

% "stations":
v = [6 5 4 3 5 6 4];

dn = datenum(dateS);

df = diff(dn)'./v;

newDates = [];
for ii = 1:numel(v)
    newDates = [newDates dn(ii) + (0:v(ii))*df(ii)];
end

newStrings = datestr(newDates, 'yyyy-mm-dd HH:MM:SS');

数组newStrings最终包含以下内容:例如,您可以看到第一次和第二次之间的间隔已被拆分为6个15分钟段

2004-09-02 06:00:00
2004-09-02 06:15:00
2004-09-02 06:30:00
2004-09-02 06:45:00
2004-09-02 07:00:00
2004-09-02 07:15:00
2004-09-02 07:30:00
2004-09-02 08:24:00
2004-09-02 09:18:00
2004-09-02 10:12:00
2004-09-02 11:06:00
2004-09-02 12:00:00
2004-09-02 13:30:00
2004-09-02 15:00:00
2004-09-02 16:30:00
2004-09-02 18:00:00
2004-09-02 18:30:00
2004-09-02 19:00:00
2004-09-02 19:30:00
2004-09-02 20:24:00
2004-09-02 21:18:00
2004-09-02 22:12:00
2004-09-02 23:06:00
2004-09-03 00:00:00
2004-09-03 00:55:00
2004-09-03 01:50:00
2004-09-03 02:45:00
2004-09-03 03:40:00
2004-09-03 04:35:00
2004-09-03 05:30:00
2004-09-03 05:37:30
2004-09-03 05:45:00
2004-09-03 05:52:30

代码依赖于一些概念:

  1. 日期可以表示为字符串或datenum。我使用内置函数来介于它们之间
  2. 一旦您将日期/时间作为数字,就可以轻松插入
  3. 我使用diff函数来查找连续时间之间的差异
  4. 我不会尝试“矢量化”代码 - 你并不是要求有效的代码,而像这样的例子,for循环的清晰度胜过一切。