假设我有一个数据集:
Jday = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
datenum('2009-01-05 23:00','yyyy-mm-dd HH:MM');
DateV = datevec(Jday);
DateV(4,:) = [];
DateV(15,:) = [];
DateV(95,:) = [];
Dat = rand(length(Jday),1)
如何删除测量次数少于 24 次的所有日期。例如,第一天只有 23 个测量值,因此我需要删除这一整天,如何对所有阵列重复此操作?
最佳答案
一个快速的解决方案是使用 unique()
按年、月、日进行分组,然后使用 accumarray()
计算每天的观察值,并排除小于 24 的观察值具有两步逻辑索引的 obs:
% Count observations per day
[unDate,~,subs] = unique(DateV(:,1:3),'rows');
counts = [unDate accumarray(subs,1)]
counts =
2009 1 1 22
2009 1 2 24
2009 1 3 24
2009 1 4 24
2009 1 5 23
然后,将条件应用于计数并检索逻辑索引
% index only those that meet criteria
idxC = counts(:,end) == 24
idxC =
0
1
1
1
0
% keep those which meet criteria (optional, for visual inspection)
counts(idxC,:)
ans =
2009 1 2 24
2009 1 3 24
2009 1 4 24
最后,通过ismember()
通过第二轮逻辑indexinf找到Dat
中属于所选counts
的成员:
idxDat = ismember(subs,find(idxC))
Dat(idxDat,:)
关于matlab - 只保留存在 24 个值的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583299/