4

測定値が1時間間隔で記録される年次時系列があります。

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

1年の各週の平均24時間サイクルを計算したい、つまり1週目、1年目から7年目の日、00:00、01:00などの平均を計算したいので、最終的には最終的には52、24時間のシリーズ、つまり1年の各週に1つになります。Matlabには、指定されたセリエル日付番号から週番号を返す「weeknum」という関数がありますが、この関数は財務ツールボックスにあります。誰かが週番号を見つけるための別の方法を提案できますか?

4

4 に答える 4

2

たぶんこれは助けになるかもしれません(私は例として現在の日付と時刻を使用しています):

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

このソリューションがエッジケースを適切に処理する方法はわかりませんが、開始するのに適した場所だと思います。

また、現在の週番号を示すこのWebサイトで確認することもできます。

これを例に適用すると、たとえば次のようになります。

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

ウィキペディアによると、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

月曜日を週の最初の日とする単純な平日関数:

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 に答える
0

あなたが質問を投稿してからしばらく経ちましたが、人々が私と同じ問題を抱えているのであれば、私は追加の答えを与えたいと思います。HebeleHododoがすでに示したように、ISO週数の計算方法についてウィキペディアに投稿されたルールがあります。しかし、とにかく、私はそれのための一般的なコードスニペットを見つけることができませんでした。

そのため、任意の基準年を持つ任意の日時のベクトル、行列、または単一の値を取得できる次の汎用メソッドを開発しました。建設的なフィードバックをお読みください。私はMATLABR2017aで正常に実行し、いくつかのエッジケースについてさらにテストしました。

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 に答える