Power BI日期范围切片器制作:按年份筛选项目的实现方案
问题背景
原始项目数据表:
| 项目名称 | 阶段 | 开始日期 | 结束日期 |
|---|---|---|---|
| Project A | 管道工程 | March 7th, 2022 | September 11th, 2025 |
| Project A | 翻新工程 | September 13th, 2023 | May 4th, 2025 |
| Project A | 评估 | September 13th, 2023 | January 31st, 2026 |
需求:创建年份切片器,选择2024时需显示Project A(该项目所有阶段在2024年都处于进行中)。此前已用pandas将表逆转为以下结构,但无法实现需求:
| 项目名称 | 阶段 | 状态 | 日期 |
|---|---|---|---|
| Project A | 管道工程 | 开始 | March 7th, 2022 |
| Project A | 管道工程 | 结束 | September 11th, 2025 |
| Project A | 翻新工程 | 开始 | September 13th, 2023 |
| Project A | 翻新工程 | 结束 | May 4th, 2025 |
| Project A | 评估 | 开始 | September 13th, 2023 |
| Project A | 评估 | 结束 | January 31st, 2026 |
解决方案
方案一:Power BI内通过度量值实现(无需修改原始表结构)
- 先修正日期类型:确保原始表的
开始日期和结束日期是Power BI可识别的日期格式(数据视图中选中列,在“列工具”里转换为日期类型)。 - 创建独立年份切片器表:
- 进入「建模」选项卡 → 新建表,输入DAX公式:
年份表 = CALENDARAUTO() - 在这个新建表中添加年份提取列:
年份 = YEAR('年份表'[Date]) - 把
年份字段拖到视觉对象面板,创建年份切片器。
- 进入「建模」选项卡 → 新建表,输入DAX公式:
- 编写判断度量值:
项目是否在年份内 = VAR 选中年份 = SELECTEDVALUE('年份表'[年份]) RETURN IF( COUNTROWS( FILTER( '原始项目表', YEAR('原始项目表'[开始日期]) <= 选中年份 && YEAR('原始项目表'[结束日期]) >= 选中年份 ) ) > 0, "显示", "隐藏" ) - 应用筛选:在卡片/表格的「筛选器」面板中,添加
项目是否在年份内,设置为等于“显示”。
选择2024时,所有满足「开始年份≤2024且结束年份≥2024」的项目会被自动筛选出来。
方案二:导入前通过Python生成年份范围行
如果要在导入Power BI前完成数据转换,用pandas生成每个项目阶段覆盖的所有年份:
- 转换日期类型并生成年份范围:
import pandas as pd # 读取原始数据表 df = pd.read_excel("你的数据文件路径.xlsx") # 转换日期列格式 df["开始日期"] = pd.to_datetime(df["开始日期"]) df["结束日期"] = pd.to_datetime(df["结束日期"]) # 生成每个阶段覆盖的年份列表 def get_year_range(row): start_year = row["开始日期"].year end_year = row["结束日期"].year return list(range(start_year, end_year + 1)) df["覆盖年份"] = df.apply(get_year_range, axis=1) # 展开年份列,生成多行数据 df_final = df.explode("覆盖年份", ignore_index=True) - 最终表结构示例:
项目名称 阶段 开始日期 结束日期 覆盖年份 Project A 管道工程 2022-03-07 2025-09-11 2022 Project A 管道工程 2022-03-07 2025-09-11 2023 Project A 管道工程 2022-03-07 2025-09-11 2024 Project A 管道工程 2022-03-07 2025-09-11 2025 ... ... ... ... ...
将这个表导入Power BI后,直接用覆盖年份做切片器,就能筛选出对应年份的项目。
为什么之前的逆透视结构无效?
逆透视后的表只有「开始」「结束」两个单独日期点,切片器选择2024时,只会匹配日期等于2024的行,但你的数据里没有2024年的日期记录,因此无法筛选出项目。必须基于年份范围的包含关系判断,而非单个日期点匹配。
内容的提问来源于stack exchange,提问作者Muhammad Galang Gardamukti
相关产品推荐
相关产品推荐

