4

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

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

4

4 回答 4

2

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

c = datevec(datestr(now));
week_num = ceil(diff(datenum([c(1), 1, 1, 0, 0, 0; c])) / 7)

我不确定这个解决方案如何正确处理边缘情况,但我认为这是一个很好的起点。

您也可以通过显示当前周数的网站进行验证。

例如,可以将其应用于您的示例,如下所示:

weeknum = @(v)ceil(diff(datenum([v(1), 1, 1, 0, 0, 0; v(:)'])) / 7);
arrayfun(@(n)weeknum(DateTime(n, :)), 1:size(DateTime, 1))'
于 2012-12-18T11:40:42.313 回答
1

根据 Wikipedia,ISO 周数是这样计算

我今天做了一个例子。

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。

于 2012-12-18T11:56:41.453 回答
0

尽管自从您发布问题以来已经过去了一段时间,但如果人们会遇到与我相同的问题,我想给出一个额外的答案。正如 HebeleHododo 已经指出的那样,在 Wikipedia 上发布了一条如何计算 ISO 周数的规则。但无论如何,我找不到它的通用代码片段。

因此,我开发了以下通用方法,该方法能够采用任意参考年份的任意日期时间的向量、矩阵或单个值。感谢阅读任何建设性的反馈。我在 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
于 2019-06-06T13:52:02.640 回答
0

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

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
于 2015-11-23T12:44:44.213 回答