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
相关产品推荐
相关产品推荐

