You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期条件拆分数据集行以适配PowerBI日报表?

解决跨日期记录拆分问题(PowerQuery & Python Pandas实现)

PowerQuery 实现步骤

  1. 加载数据到PowerQuery编辑器
    打开PowerBI导入数据集后,进入PowerQuery编辑器。
  2. 添加自定义列生成日期序列
    添加自定义列,生成当前记录覆盖的所有日期列表:
    = List.Dates(Date.From([Date_Start]), Duration.Days(Date.From([Date_End]) - Date.From([Date_Start])) + 1, #duration(1,0,0,0))
    
    将该列命名为Date_List。
  3. 展开日期列表
    点击Date_List列右侧的展开按钮,选择「展开到新行」,将每个日期拆分为单独行。
  4. 计算每日实际时段
    添加两个自定义列,分别计算当日的起始和结束时间:
    • 每日起始时间:
      = 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)
      
  5. 整理字段
    保留原记录的业务字段,删除不需要的中间列后,关闭并应用到PowerBI模型。

Python Pandas 实现步骤

假设数据集已加载为DataFramedf,包含Date_Start、Date_End及其他业务字段:

  1. 转换日期字段为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')
    
  2. 生成日期范围并拆分记录
    创建包含所有覆盖日期的列,再展开为多行:
    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)
    
  3. 计算每日时段
    通过条件判断生成当日的起始和结束时间:
    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)
    )
    
  4. 整理数据
    按需保留业务字段,删除原Date_Start、Date_End或date_range等中间列即可。

内容的提问来源于stack exchange,提问作者Rafa VR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:22:20