我有一个年度时间序列,每小时记录一次测量值:
StartDate = '2011-01-01 00:00';
EndDate = '2011-12-031 23:00';
DateTime=datevec(datenum(StartDate,'yyyy-mm-dd HH:MM'):60/(60*24):...
datenum(EndDate,'yyyy-mm-dd HH:MM'));
dat = 2+(20-2).*rand(size(DateTime,1),1);
我想计算一年中每周的平均24小时周期,即第1周,第1年到第7天的平均值我想计算平均00:00,01:00,...等等所以最终我将得到52,24小时系列,即一年中每周一个。 Matlab确实有一个名为'weeknum'的函数,它返回给定seriel日期编号的周数,但是,这个函数在财务工具箱中。任何人都可以提出一种寻找周数的替代方法吗?
答案 0 :(得分:2)
也许这会有所帮助(我以当前的日期和时间为例):
c = datevec(datestr(now));
week_num = ceil(diff(datenum([c(1), 1, 1, 0, 0, 0; c])) / 7)
我不确定此解决方案如何正确处理边缘情况,但我认为这是一个很好的起点。
您还可以使用this website验证当前周数。
将此应用于您的示例可以完成,例如:
weeknum = @(v)ceil(diff(datenum([v(1), 1, 1, 0, 0, 0; v(:)'])) / 7);
arrayfun(@(n)weeknum(DateTime(n, :)), 1:size(DateTime, 1))'
答案 1 :(得分:0)
根据维基百科,ISO周数计算为like this。
我今天做了这个例子。
offsetNotLeap = [0 31 59 90 120 151 181 212 243 273 304 334];
offsetLeap = [0 31 60 91 121 152 182 213 244 274 305 335];
todayVector = datevec(today);
todayNum = today;
ordinalDay = offsetLeap(todayVector(2)) + todayVector(3);
dayOfTheWeek = weekday(todayNum);
weekNumber = fix((ordinalDay - dayOfTheWeek + 10)/ 7)
weekNumber =
51
我没有对0和53个案件进行检查。 另请注意,MATLAB的工作日函数将星期日的索引设为1,因此如果要使星期一的索引为1,则需要进行一些调整。 ISO表示星期一应为1。
答案 2 :(得分:0)
尽管自您发布问题以来已经过去了一段时间,但如果人们会遇到与我相同的问题,我想再提供一个答案。正如HebeleHododo已经指出的那样,存在于Wikipedia how to compute the ISO week number上的一条规则。但是无论如何,我找不到它的通用代码段。
因此,我开发了以下通用方法,该方法能够获取具有任意参考年的任意日期时间的向量,矩阵或单个值。感谢阅读任何建设性的反馈。我成功地在MATLAB R2017a上运行了该代码,并在某些边缘情况下对其进行了进一步测试。
function week_num = get_week_num(dtimes)
dnums = datenum(dtimes);
firsts = datenum(year(dtimes), 1, 1);
ordinal = floor(dnums - firsts);
wday = weekday(dtimes) - 1;
wday(wday == 0) = 7;
week_num = floor((ordinal + wday + 10) / 7);
end