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 分があります。それらを合わせた 5 つの間隔は、90 分 / 5 = 18 分になります。ここで、(1) と (2) の間に 5 つの「読み値」を挿入します。それぞれ 18 分で区切られています。すべてのdateSに対してそれを行う必要があります。

何か案は?ありがとう!

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

次のコードは、あなたが望むことを行います(ベクターの要素数がこれのエントリ数よりも1少ないv限り、任意の値を選択しました):vdateS

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には次のものが含まれます。たとえば、1 回目と 2 回目の間隔が 15 分の 6 つのセグメントに分割されていることがわかります。

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 に答える