在matlab中计算周数

时间:2012-12-18 10:25:03

标签: matlab week-number

我有一个年度时间序列,每小时记录一次测量值:

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日期编号的周数,但是,这个函数在财务工具箱中。任何人都可以提出一种寻找周数的替代方法吗?

3 个答案:

答案 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