質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Power BI

Power BIは、マイクロソフト社が提供しているBIツールです。レポートの作成・共有、エクセルや会計システムなどさまざまなソフトウエアのデータをグラフやチャートに変換。データの分析・解析などにも利用できます。

Q&A

解決済

3回答

1491閲覧

Powerquery(M言語)にて日付から月曜始まりの週番号を求めたいが、週番号が正しく計算されない

kassyi

総合スコア9

Power BI

Power BIは、マイクロソフト社が提供しているBIツールです。レポートの作成・共有、エクセルや会計システムなどさまざまなソフトウエアのデータをグラフやチャートに変換。データの分析・解析などにも利用できます。

0グッド

1クリップ

投稿2023/12/07 04:25

実現したいこと

日付から月曜始まりの週番号を求めたい。基本は以下のコードである。

Powerquery

1Date.WeekOfYear(#date(2023,4,1), Day.Monday) 2//2023年4月1日(土曜日)→13週目(月曜始まり) 3//結果→ OK!!

問題

2023年4月2日を境として、週番号が1ずつプラス方向にずれていってしまっている。月曜始まりなので2023年4月2日は13週目と計算されることを期待している。期待値はGoogleカレンダーや、このカレンダーで週番号を表示して確認した

Powerquery

1Date.WeekOfYear(#date(2023,4,2), Day.Monday) 2//2023年4月2日(日曜日)→14 3//NG。13週目はなず…

質問

どうすれば問題のコードは期待値通りになりますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

問題のコードは、Date.WeekOfYear関数で週番号を計算しています。この関数は、指定された日付の週番号を、指定された曜日を基準として計算します。

2023年4月1日は土曜日であり、月曜日始まりなので、13週目となります。

2023年4月2日は日曜日であり、月曜日始まりなので、13週目となるはずです。

しかし、問題のコードでは、2023年4月2日は14週目と計算されています。これは、Date.WeekOfYear関数が、指定された日付の曜日を基準として週番号を計算するのではなく、指定された曜日の週の最初の日付を基準として週番号を計算しているためです。

したがって、2023年4月2日は、月曜日始まりの週の最初の日付である2023年4月3日を基準として計算されるため、14週目と計算されます。

期待値通りに計算するには、Date.WeekOfYear関数の引数として、指定された日付ではなく、指定された曜日の週の最初の日付を指定する必要があります。

修正後のコードは、次のようになります。

Date.WeekOfYear(#date(2023,4,3), Day.Monday)
このコードでは、2023年4月3日を基準として週番号を計算するため、2023年4月2日は13週目と計算されます。

また、PowerQueryの M 言語では、Date.FirstDayOfWeek関数を使用して、指定された曜日の週の最初の日付を取得できます。

修正後のコードは、次のようになります。

Date.WeekOfYear(Date.FirstDayOfWeek(#date(2023,4,2), Day.Monday), Day.Monday)
このコードも、2023年4月2日は13週目と計算されます。
only up

投稿2024/01/18 03:54

damdam23

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kassyi

2024/01/18 08:14

詳しい解説、ありがとうございました!!とってもスッキリしました。
guest

0

自己解決

ベストアンサーをつけた方の回答では詳細エディターを使った方法ではうまくいかなかったので、C#のライブラリを見ながら自力実装しました。
https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Globalization/ISOWeek.cs

Powerquery

1let 2 //1~7の曜日に相当する値を返す。月曜で始まり日曜で終わる 3 getIsoWeekDay = (d) => if(Date.DayOfWeek(d) = Day.Sunday) then 7 else Date.DayOfWeek(d), 4 //iso8601の週番号を計算 5 //how to use→ getIsoWeekNumber(#date(2023,4,2)) 6 getIsoWeekNumber = (d)=> Number.RoundDown((Date.DayOfYear(d) - getIsoWeekDay(d) +10)/7),

投稿2023/12/08 00:09

編集2023/12/08 00:12
kassyi

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

[香車]東上☆あらし☆海美「
Powerquery は、わからんので、普通の Excel の関数で

=WEEKNUM(B11,2)

とやったら、

3月30日 14
3月31日 14
4月1日 14
4月2日 14
4月3日 15
4月4日 15

となりました。14 なのは、2023 年 1 月 1 日(土) を第一週、2023 年 1 月 2 日(日) を第二週と数えているから。13 にしたければ、-1 すればいいと思います。

回答への修正依頼: スパムと見受けられる内容を含む回答 2023/12/08 12:00
[香車]東上☆あらし☆海美「
『2023 年 1 月 1 日(土) を第一週』とするか、『2023 年 1 月 2 日(日)を第一週』とするか、の検証が含まれているので、スパムではないと考えます。

投稿2023/12/07 13:23

編集2023/12/08 04:19
umimi

総合スコア504

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kassyi

2023/12/07 22:58

すみません、お手数をおかけしました。たすかりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問