【问题标题】:changing time series and corresponding data变化的时间序列和相应的数据
【发布时间】:2014-10-22 21:56:16
【问题描述】:

我想将我的时间向量 (T1) 及其对应的数据 (Data1) 更改为新的时间向量 (T2) 并将 Nan 包含在相应的数据 (Data2) 中。 例如:-

T1                        Data1
01-Sep-2007 00:00:30       0.01
01-Sep-2007 00:01:30       0.02
01-Sep-2007 00:02:30       0.03
01-Sep-2007 00:03:30       0.05
01-Sep-2007 00:04:29       0.08
01-Sep-2007 00:07:30       0.09
01-Sep-2007 00:09:29       0.05

我想将 T1 和 Data1 更改为一个新的向量 T2 和 Data2,我希望它如下所示:-

T2                        Data2
01-Sep-2007 00:00:00       0.01
01-Sep-2007 00:01:00       0.02
01-Sep-2007 00:02:00       0.03
01-Sep-2007 00:03:00       0.05
01-Sep-2007 00:04:00       0.08
01-Sep-2007 00:05:00       NaN
01-Sep-2007 00:06:00       NaN
01-Sep-2007 00:07:00       0.09
01-Sep-2007 00:08:00       NaN
01-Sep-2007 00:09:00       0.05

请有人帮我解决这个问题,因为我不知道在 MATLAB 中可以做到这一点的方法。任何帮助将不胜感激! 在此先感谢.. Shital

【问题讨论】:

  • T1 是哪种数据类型?它不能是向量。它是一个包含字符串的元胞数组吗?
  • 我使用 datenum 将 T1 更改为 Matlab 日期。
  • 如果您有01-Sep-2007 00:07:45,该数据值会分配给01-Sep-2007 00:07:00 还是01-Sep-2007 00:08:00?另外,您是否有可能拥有01-Sep-2007 00:07:0001-Sep-2007 00:07:10,在这种情况下您会怎么做?
  • 为了便于理解,我将 T1 和 T2 显示为字符串。否则在我的脚本中,我使用 Datenum 将字符串转换为序列日期号
  • 我怀疑这会让它更容易理解:-)

标签: matlab


【解决方案1】:

假设您有 t1data

>> t1, data1

t1 =

01-Sep-2007 00:00:30
01-Sep-2007 00:01:30
01-Sep-2007 00:02:30
01-Sep-2007 00:03:30
01-Sep-2007 00:04:29
01-Sep-2007 00:07:30
01-Sep-2007 00:09:29


data1 =

    0.0100
    0.0200
    0.0300
    0.0500
    0.0800
    0.0900
    0.0500

首先你想把t1变成一个日期数字

>> t1 = datenum(t1);

然后四舍五入到前一分钟

>> dt = 1 / 24 / 60;
>> t1_rounded = floor(t1 / dt) * dt;

现在您可以创建您的t2 向量

>> t2 = (min(t1_rounded):dt:max(t1_rounded))';

并使用histc 命令的第二个输出来匹配索引 -

>> [~, index] = histc(t1, [t2; Inf]);

最后的Inf 捕获任何从t2 向量末端掉落的东西。最后,您只需创建充满NaNs 的新数据向量并分配给它。

>> data2 = NaN(size(t2));
>> data2(index) = data1;

所以你的结果是

>> datestr(t2), data2

ans =

01-Sep-2007 00:00:00
01-Sep-2007 00:01:00
01-Sep-2007 00:02:00
01-Sep-2007 00:03:00
01-Sep-2007 00:04:00
01-Sep-2007 00:05:00
01-Sep-2007 00:06:00
01-Sep-2007 00:07:00
01-Sep-2007 00:08:00
01-Sep-2007 00:09:00


data2 =

    0.0100
    0.0200
    0.0300
    0.0500
    0.0800
       NaN
       NaN
    0.0900
       NaN
    0.0500

【讨论】:

  • 不幸的是,我没有得到预期的 Data2.. 我得到的是 Data2 = [Nan;0.01;0.02;NaN;0.03;0.05;NaN;等]。
  • 您是否按照我的回答中的顺序执行了所有步骤?
  • 当它执行 t1_round 时, floor 或 round 命令有时会重复时间..
  • 答案假设您的数据大致等距,大约 1 分钟。如果这不是真的,那么您将不会得到正确的答案(但我不可能知道,因为我看不到您的数据)。如果您按照我显示的步骤使用您在问题中指定的数据,那么它会按预期工作。
  • 非常感谢..我按照您的指示重写了我的脚本..现在它工作正常..非常感谢您的大力帮助!!
【解决方案2】:

所以您的第一步是将T1 舍入到最接近的 30 秒(可能像这样:round(T1/dt)*dt,但这取决于您的数据)。然后你可以像这样生成T2

dt = 1/(2*60*24);
T2 = min(T1_rounded):dt:max(T1_rounded);

或最有可能

T2 = (T1_rounded(1):dt:T1_rounded(end))';

严格来说,此时您需要再次四舍五入 T2 以避免在 ismember 步骤中可能(实际上可能)浮点算术错误...

T2 = round(T2/dt)*dt

现在将Data2 初始化为正确的大小但充满NaNs:

Data2 = NaN(size(T2))

最后找到正确的索引:

ind = ismember(T2, T1_rounded)

并应用它们:

Data2(ind) = Data1

【讨论】:

  • 感谢您的回复..但是有一个问题..我的 Data2 不应该与 Data1 的大小相同。那是因为 Data1 对应于旧时间 T1,它缺少时间步或间隙..我打算通过使用 T2 并将 NaN 添加到相应的 Data2 来清除它......所以最后第三步不起作用..
  • @user3876557 抱歉,本来是T2
  • 谢谢,但正如我所说,Data1 的大小与 Data2 不同。所以不幸的是最后一步不起作用。
  • @user3876557 最后一步只要求Data1nnz(ind) 的大小。除了使用 ismember 而不是 histc... 之外,此答案与 Chris Taylor 的答案相同
  • 感谢您的帮助 Dan.. 然而,round 命令正在复制时间列.. floor 命令对我来说很好.. 谢谢!!
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2013-02-03
相关资源
最近更新 更多