如何基于日期条件拆分数据集行以适配PowerBI日报表?
解决跨日期记录拆分问题(PowerQuery & Python Pandas实现)
PowerQuery 实现步骤
- 加载数据到PowerQuery编辑器
打开PowerBI导入数据集后,进入PowerQuery编辑器。 - 添加自定义列生成日期序列
添加自定义列,生成当前记录覆盖的所有日期列表:
将该列命名为= List.Dates(Date.From([Date_Start]), Duration.Days(Date.From([Date_End]) - Date.From([Date_Start])) + 1, #duration(1,0,0,0))Date_List。 - 展开日期列表
点击Date_List列右侧的展开按钮,选择「展开到新行」,将每个日期拆分为单独行。 - 计算每日实际时段
添加两个自定义列,分别计算当日的起始和结束时间:- 每日起始时间:
= if [Date_List] = Date.From([Date_Start]) then [Date_Start] else DateTime.From([Date_List]) - 每日结束时间:
= if [Date_List] = Date.From([Date_End]) then [Date_End] else DateTime.From([Date_List]) + #duration(0,23,59,59)
- 每日起始时间:
- 整理字段
保留原记录的业务字段,删除不需要的中间列后,关闭并应用到PowerBI模型。
Python Pandas 实现步骤
假设数据集已加载为DataFramedf,包含Date_Start、Date_End及其他业务字段:
- 转换日期字段为datetime类型
import pandas as pd import numpy as np df['Date_Start'] = pd.to_datetime(df['Date_Start'], format='%d/%m/%Y %I:%M:%S %p') df['Date_End'] = pd.to_datetime(df['Date_End'], format='%d/%m/%Y %I:%M:%S %p') - 生成日期范围并拆分记录
创建包含所有覆盖日期的列,再展开为多行:df['date_range'] = df.apply( lambda x: pd.date_range(start=x['Date_Start'].floor('D'), end=x['Date_End'].floor('D'), freq='D'), axis=1 ) df = df.explode('date_range').reset_index(drop=True) - 计算每日时段
通过条件判断生成当日的起始和结束时间:df['Daily_Start'] = np.where( df['date_range'] == df['Date_Start'].dt.floor('D'), df['Date_Start'], df['date_range'] ) df['Daily_End'] = np.where( df['date_range'] == df['Date_End'].dt.floor('D'), df['Date_End'], df['date_range'] + pd.Timedelta(days=1) - pd.Timedelta(seconds=1) ) - 整理数据
按需保留业务字段,删除原Date_Start、Date_End或date_range等中间列即可。
内容的提问来源于stack exchange,提问作者Rafa VR
相关产品推荐
相关产品推荐

