matlab - 在时间序列的年份中找到独特的时间

标签 matlab vector

假设我有一个由 tt 显示的日期向量和一个对应于 aa 的相应数据系列。例如:

dd = datestr(datenum('2007-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
     datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM'),...
     'yyyy-mm-dd HH:MM');
tt = datevec(datenum(dd,'yyyy-mm-dd HH:MM'));
tt(1002,:) = [];
aa = rand(length(tt),1)

如何保证年份之间的时间和日期一致?

例如,我只想保留年份之间相同的时间,例如

2009-01-01 01:00

会和

一样
2010-01-01 01:00

广告等等。

如果一年有测量值

2009-01-01 02:00

但是 yyyy-01-01 02:00

其他年份不存在,这次应该重新去掉。

我希望返回 tt 和 aa ,其中只保留那些年份一致的时间。如何才能做到这一点?

我正在考虑首先找到独特年份的指数:

[~,~,iyears] = unique(tt(:,1),'rows');

然后找到唯一月、日和小时的索引:

[~,~,iid] = unique(tt(:,2:4),'rows');

但我不确定如何组合这些以提供所需的输出?

最佳答案

下面的解决方案使用循环将数据存储在单元化数组中,这可能效率低下,但除非您的数据集很大(有很多很多年),否则它应该可以完成这项工作。一般的想法是将数据集分解成年。我将生成的时间向量存储在元胞数组中,因为它们的长度可能不同。然后我对所有时间向量进行集合交集,以获得公共(public)时间向量。从那里它是直截了当的。

years = unique(tt(:,1), 'rows');

% Put the "sub-times" of each year into cell array
for ii = 1:length(years)
    times_each_year{ii} = tt(tt(:,1)==years(ii),2:end);
end

% Do intersection of all "sub-times" sets
common_times = times_each_year{1};
for ii = 2:length(years)
    common_times = intersect(common_times, times_each_year{ii},'rows');
end

% Find and delete the points that are not member of the "sub-times":
idx = ~ismember(tt(:,2:end),common_times,'rows');
deleted_points = datestr(tt(idx,:)); % for later review
tt(idx,:) = [];

但是,请注意 deleted_points 向量包含的点比预期的要多。那是因为2008年是闰年,所有的点都对应二月。第 29 条被删除。

如果您的数据被夏令时“污染”,则可能会发生另一种奇怪的情况。

关于matlab - 在时间序列的年份中找到独特的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23828905/

相关文章:

python - Matlab到Python的转换: "poissinv" function

matlab - 在数组中查找 n 个最小值

c++ - boost-variant的 vector

C# 如何将点转换为 vector2?

r - 我如何找到连续的值

c++ - 使用 engGetVariable 在 MATLAB R2014a 中检索结构时出错

string - 在matlab中组合字符串和数字

c++ - 如何使用运算符<<打印类对象

java - 从起始坐标、角度和距离获取点

Matlab:根据创建日期对文件进行排序