Kalenderwochen sind...lästig. Bei Entwicklungen, wie Bestände oder Umsatz sind sie Kalenderwochen aber beliebt. Wir zeigen, wie man mit ihnen umgeht.

Wie sind Kalenderwochen eigentlich definiert?

Und hier kommen wir direkt zum Hauptproblem: Es kommt drauf an! Amerikaner beginnen ihre Woche mit einem Sonntag. Verwendet man in Power BI einen relativen Datums-Slicer, wird man direkt damit konfrontiert. Heute ist der 10. September 2021. Aus europäischer Sicht geht die letzte vollständige Kalenderwoche vom 30.08.2021-05.09.2021. Aber:

Relativer Datumsslicer in Power BI mit Kalenderwochen

Und das lässt sich in Power BI auch nicht umstellen.

Damit adressieren wir aber nur das Problem, ob eine Kalenderwoche am Sonntag oder am Montag beginnt. In Europa beginnt sie Montags - darauf können wir uns einigen. Was machen wir aber zum Jahreswechsel?

Neues Jahr, neues Glück

Sagen wir doch einfach, dass im neuen Jahr die Zählung aufs neue beginnt. Die erste Woche, egal an welchem Tag sie beginnt, hat die Nummer 1. Hört sich pausibel an.

Bedeutet aber, dass eine Woche, beispielsweise die Woche vom 28.12.2020-03.01.2021 zwei Wochennummern erhält:

  • 28.12.2020-31.12.2020: KW53
  • 01.01.2021-03.01.2021: KW01

Sagen wir, wir sollen jetzt den durchschnittlichen Umsatz pro Kalenderwoche der letzten fünf Jahre ermitteln. Sie ahnen es schon: die Kalenderwoche KW53/2020 hat nur drei Tage, die Kalenderwoche KW01/2021 nur 4. Diese beiden kürzeren Kalenderwochen verfälschen den Schnitt. Weil man ja davon ausgeht, dass eine Kalenderwoche immer sieben Tage habt - richtig?

Immer wieder Montags...

Wenn wir die Woche zum Jahreswechsel nicht teilen wollen, müssen wir uns entscheiden, ob die Woche zum alten oder neuen Jahr gehört. Nun könnte man sagen, dass die Woche immer zu dem Jahr gehört, in dem sie anfängt. Also das Jahr, welches in welches der Montag fällt. Dieser Ansatz ist leicht zu verstehen,

Das würde wiederum bedeuten, dass falls der 31.12. ein Montag ist (beispielsweise der 31.12.2018), der komplette Umsatz vom 1.1.2019-06.01.2020 noch zum Jahr 2019 zählt. Auch nicht schön...

Wo ist mehr Woche drin?

Wir können auch festlegen, dass die Kalenderwoche immer in das Jahr gehört, in dem mehr Woche vorkommt. Mehr Woche heißt, wo mehr Tage der Woche vorkommen. Die Mitte der Woche ist Donnerstag. Damit kann man sagen, dass falls die erste Woche im Jahr den Donnerstag beinhaltet, gehört die Woche zum neuen Jahr. Ansonsten eben zum Alten.

Diese Vorgehensweise wird auch so von der ISO 8601 festgelegt.

Wie können wir die ISO Kalenderwoche aber berechnen?

Kalenderwoche in Excel, Power Query und DAX

In Excel ist das Kalenderwochenproblem wirklich schon lang bekannt. Daher gibt es dort neben der Funktion Kalenderwoche auch die Funktion ISOKALENDERWOCHE().

Wer in Power Query schon einmal die Funktion Date.WeekOfYear() verwendet hat, wird (hoffentlich) bemerkt haben, dass die Kalenderwochen leider so gar nicht der obigen ISO-Norm entsprechen. Man kann die Woche zwar mit Montag beginnen lassen. Aber der Jahreswechsel bedeutet immer eine neue Zählung. Damit erhält man auch manchmal 54 Kalenderwochen im Jahr.

Und dann gibt es noch die DAX-Funktion WEEKNUM(). Diese liefert genau das gleiche Ergebnis, wie Power Query. Auch hier kann man mit Montag beginnen, trotzdem beginnt ein neues Jahr immer mit Kalenderwoche 1.

Abhilfe in DAX

In DAX gibt es gottseidank Abhilfe. Die Funktion WEEKNUM kennt zwei Parameter:

  • Datum: Das Datum, dessen Kalenderwoche ermittelt werden soll
  • (optional) ReturnType: Laut Pop-Up Hilfe scheint man hier nur festzulegen, ob die Woche an einem Sonntag oder einem Montag beginnt.

Der ReturnType hat aber noch mehr Optionen, die im Editor (weder in Excel Power Pivot noch in Power BI) dargestellt werden:

Return_Type Optionen bei WEEKNUM in DAX

Wichtig die Spalte System. Bei System 1 beginnt ein Jahr immer mit Kalenderwoche 1 unabhängig welcher Wochentag der 1.1. ist und wie viele Tage in welches Jahr fallen. System 2 (also nur Option 21) arbeteitet gemäß ISO 8601.

Abhilfe in Power Query

Mit einer eingebauten Funktion kommt man hier leider nicht weiter. Daher haben wir für uns eine eigene Funktion geschrieben, die für ein Datum die richigen Kalenderwochen-Informationen zurückgibt (diese Funktion nutzen wir auch in unseren eigenen Kalendertabellen-Funktion):

Aus unserer Website www.powerqueryformatter.com/formatter finden Sie die Funktion bei den Snippets unter dem Namen Date_GetCalendarweekInfoISO8601 - direkt als Kopiervorlage.

Hinweis zur Nutzung dieser Funktion

Die Funktion gibt nicht einfach eine Kalenderwoche zurück, sondern ein Record bestehend aus Kalenderwoche (weekNoISO8601) und Jahr der Kalenderwoche (yearOfWeekNoISO8601).

Achtung Filter!

Die oben gelistete Power Query Funktion gibt keine Kalenderwoche, sondern ein Record bestehend aus Kalenderwoche und dem zugehörigen Jahr zurück. Das Jahr, dass sich auf die IDO Kalenderwoche bezieht, kann ein anderes Jahr sein, als das Jahr des aktuellen Datums:

  • 01.01.2020: 2020/KW01 (Jahr des Datums identisch mit Jahr der Kalenderwoche)
  • 01.01.2021: 2020/KW53 (Die Kalenderwoche erhält noch das alte Jahr in der Bezeichnung)
  • 31.12.2019: 2020/K01 (die Kalenderwoche erhält schon das kommende Jahr in der Bezeichnung)

Daher gibt die Power Query Funktion beide Informationen zurück.

In unserem Artikel wie man eine Kalendertabelle erzeugt, finden Sie eine Variante mit Power Query und eine mit DAX als Kopiervorlage. Beide Varianten beinhalten nicht nur die ISO Kalenderwoche, sondern auch das zugehörige Jahr.

Wenn Sie in Ihren Berichten jetzt einen Jahresfilter anbieten möchten, müssen Sie beachten, dass es jetzt natürlich einen Unterschied macht, ob Sie das Jahr des Datums oder das Jahr der Kalenderwoche anbieten. Nutzen Sie in Ihrem Bericht ISO-Kalenderwochen und lassen den Benutzer das kalendarische Jahr filtern, "verlieren" Sie unter Umständen ein paar Tage bei der ersten oder bei der letzten Kalenderwoche!

Vergleich mit vorheriger Kalenderwoche - der KW Index

Der Vergleich aktuelles Jahr mit Vorjahr ist mit DAX ein Klacks. Die Funktionen

  • SAMEPERIODLASTYEAR()
  • DATEADD()

helfen weiter. Das gleiche gilt für den Vortag, Vormonat oder das vorherige Quartal. Die vorherige Kalenderwoche stellt einen relgelmäßig vor Probleme. Da schon die Definition der Kalenderwoche schwierig ist, findet man in DAX einfach keine Funktion dafür.

Im bereits erwähnten Artikel finden Sie in beiden Varianten (Power Query und DAX) eine Spalte mit Namen KW ISO8601 Index. Damit lässt sich in DAX eine entsprechende Measure erzeugen, die die aktuelle KW mit der vorherigen vergleicht:

Das Prinzip ist wie bei einem Vormonats- oder Vorjahresvergleich:

Zuerst wird sichergestellt, dass aktuell eine Kalenderwoche eindeutig ausgewählt ist (sonst ergibt der Vergleich keinen Sinn). Für jedes Vorkommen von DimKalender[Jahr & KW ISO8601 (YYYYWW)] ist auch das Feld DimKalender[KW ISO8601 Index] eindeutig. Daher können wir in dem Filter in der CALCULATE-Funktion auf den aktuellen Wert von DimKalender[KW ISO8601 Index] mit VALUES() zugreifen. Von diesem Wert müssen wir nur 1 abziehen und erhalten damit alle Tage der Vorwoche.