1

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

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 格式相同。

编辑:

列表中的前 2 个读数之间有 1 小时 30 分钟 = 90 分钟。五个间隔 b/w 等于 90 分钟 / 5 = 18 分钟。现在在 (1) 和 (2) 之间插入五个“读数”,每个读数间隔 18 分钟。我需要对所有日期都这样做。

有任何想法吗?谢谢!

4

2 回答 2

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
于 2013-08-07T20:34:46.787 回答
2

以下代码可以满足您的要求(我选择了任意值v- 只要向量中的元素数v比其中的条目数少 1 就可以了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循环的清晰度胜过一切。
于 2013-08-07T20:20:39.657 回答