Power BI中如何按月份计算周数?现有DAX公式结果不符预期
解决DAX计算周归属月份及对应周数的问题
问题分析
你当前的DAX公式WEEKNUM([Date],2) - WEEKNUM(EOMONTH([Date],-1)+1,2)+1是计算日期所在自然月内的周数,所以2023年9月1日会被判定为9月的第1周,但你的需求是将跨月的周归到天数占比更多的月份(比如2023.9.1所在周8.28-9.3,8月占4天,应归为8月第5周),两者逻辑不符。
解决方案DAX公式
归属月周数 = VAR CurrentDate = [Date] VAR WeekStart = CurrentDate - WEEKDAY(CurrentDate, 2) + 1 // 以周一为周起始日 VAR PrevMonthEnd = EOMONTH(CurrentDate, -1) // 判断当前周是否归属上月:周起始在上月,且上月包含该周≥4天(超过一周的一半) VAR IsPrevMonthWeek = WeekStart <= PrevMonthEnd && (PrevMonthEnd - WeekStart + 1) >= 4 VAR TargetMonth = IF(IsPrevMonthWeek, PrevMonthEnd, EOMONTH(CurrentDate, 0)) VAR TargetMonthStart = DATE(YEAR(TargetMonth), MONTH(TargetMonth), 1) VAR TargetMonthFirstWeek = WEEKNUM(TargetMonthStart, 2) VAR CurrentWeek = WEEKNUM(CurrentDate, 2) // 跨年周数调整:比如1月部分周属于上一年最后一周,周数会从52/53跳转到1 VAR WeekAdjust = IF(CurrentWeek < TargetMonthFirstWeek, 52, 0) VAR WeekInMonth = CurrentWeek - TargetMonthFirstWeek + 1 + WeekAdjust RETURN FORMAT(TargetMonth, "mmmm") & "-第" & WeekInMonth & "周"
公式逻辑说明
- 确定周范围:先算出当前日期所在周的周一(
WeekStart),匹配你使用WEEKNUM第2参数(周一为周起始)的规则。 - 判断归属月份:如果周起始在上月,且上月包含该周至少4天,就将该周归为上月;否则归为当前月。
- 计算归属月内的周数:
- 取归属月的第一天,算出它的周数
- 用当前日期的周数减去归属月第一天的周数,加1得到基础周数
- 加入跨年调整:若当前周数小于归属月第一天的周数(比如1月的周属于上一年的52周),则加52修正
- 格式化输出:用
FORMAT将归属月转为中文月份名称,拼接成“X月-第X周”的格式。
测试验证
针对2023年9月1日:
WeekStart为2023/8/28,PrevMonthEnd为2023/8/31,上月包含该周4天(28-31),满足≥4天的条件,归属月为8月- 8月1日的周数是31,9月1日的周数是35,
35-31+1=5,最终输出八月-第5周,符合预期。
内容的提问来源于stack exchange,提问作者o___e
相关产品推荐
相关产品推荐

