【问题标题】:Calculate week numbers in matlab在matlab中计算周数
【发布时间】:2012-12-18 10:25:03
【问题描述】:

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

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”的函数,它从给定的序列日期号返回周数,但是,这个函数在金融工具箱中。谁能建议另一种查找周数的方法?

【问题讨论】:

标签: matlab week-number


【解决方案1】:

也许这会有所帮助(我以当前日期和时间为例):

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))'

【讨论】:

    【解决方案2】:

    根据维基百科,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 的 weekday 函数将星期日的索引设为 1,因此如果您想让星期一的索引为 1,则需要进行一些调整。 ISO 说星期一应该是 1。

    【讨论】:

      【解决方案3】:

      只是一个简单的工作日函数,将星期一作为一周的第一天:

      function [ daynumber,dayname ] = weekd( date )
      %WEEKD Returns the day number and day name based on the input date
      %   First day of week
      %   -----------------
      %   The first day of the week is Monday.
      %
      %   Parameter
      %   ---------
      %   date = Input date -> format: dd.mm.yyyy / Example: 21.11.2015
      
      [dn,dayname] = weekday(datenum(date,'dd.mm.yyyy'));
      
      if dn == 1;
         daynumber = 7;
      elseif dn >= 2 && dn <= 7
         daynumber = dn - 1;
      else      
         error('Invalid weekday number.'),
      end
      
      end
      

      【讨论】:

        【解决方案4】:

        虽然自您发布问题以来已经过去了一段时间,但如果人们会遇到与我相同的问题,我想给出一个额外的答案。正如 HebeleHododo 已经指出的那样,在 Wikipedia how to compute the ISO week number 上发布了一条规则。但无论如何,我找不到它的通用代码 sn-p。

        因此,我开发了以下通用方法,该方法能够获取具有任意参考年份的任意日期时间的向量、矩阵或单个值。感谢阅读任何建设性的反馈。我在 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-23
          相关资源
          最近更新 更多