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

Power BI多格式小时列清洗及数值化转换方法咨询

解决Power BI中时间格式转小数小时的问题

方法1:Power Query(M语言)批量清洗

进入Power Query编辑器,选中hours列后添加自定义列,使用以下M语言代码:

let
    // 移除所有行的{YearMonthDayTime}后缀
    CleanText = Text.Remove([hours], "{YearMonthDayTime}"),
    // 截取PT之后的时间部分
    TimePart = Text.AfterDelimiter(CleanText, "PT"),
    // 提取小时数,无H则返回0
    Hours = try Number.From(Text.BeforeDelimiter(TimePart, "H")) otherwise 0,
    // 提取分钟数,无M则返回0
    Minutes = try Number.From(Text.BeforeDelimiter(Text.AfterDelimiter(TimePart, "H", 0, 1), "M")) otherwise 0,
    // 转换为小数格式的小时
    DecimalHours = Hours + Minutes / 60
in
    DecimalHours

代码逻辑说明:

  • 先统一移除所有行的{YearMonthDayTime}后缀,不管该行原本有没有
  • 剥离开头的PT标识,只保留时间数字部分
  • 分别提取小时(H)和分钟(M)的数值,遇到无对应标识的情况(比如PT0S、PT10H)自动返回0
  • 将分钟转换为小时的小数部分,与小时数相加得到最终结果

方法2:DAX计算列(报表内直接转换)

如果不需要修改原始数据,可在数据模型中创建计算列,使用以下DAX公式:

Decimal Hours = 
VAR CleanText = SUBSTITUTE([hours], "{YearMonthDayTime}", "")
VAR TimePart = RIGHT(CleanText, LEN(CleanText)-2) // 移除开头的PT
VAR Hours = IF(SEARCH("H", TimePart, 1, 0) > 0, VALUE(LEFT(TimePart, SEARCH("H", TimePart)-1)), 0)
VAR Minutes = IF(SEARCH("M", TimePart, 1, 0) > 0, VALUE(MID(TimePart, SEARCH("H", TimePart)+1, SEARCH("M", TimePart)-SEARCH("H", TimePart)-1)), 0)
RETURN Hours + Minutes / 60

代码逻辑说明:

  • 用SUBSTITUTE清除所有行的后缀内容
  • 截取PT之后的字符串作为时间主体
  • 通过SEARCH定位H和M的位置,提取对应数字;无对应标识时返回0
  • 计算分钟转小时的小数,与小时数求和得到最终值

两种方法都能自动处理所有格式:

  • PT5H15M{YearMonthDayTime} → 5.25
  • PT3H30M → 3.5
  • PT10H → 10
  • PT0S{YearMonthDayTime} → 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:43:33