在Power BI/Power Query中将d h m s格式时长转为秒数并自动计算
将时长字符串(如31d、1h30m)转换为总秒数
你已经通过多层SUBSTITUTE把时长字符串转换成了运算表达式,但这类字符串无法直接被DAX/Excel自动计算,以下是两种可行的解决方案:
方案1:Power BI(DAX)直接计算
直接拆分时长字符串中的天、时、分、秒数值,分别转换为秒后累加:
inSEC = VAR DownText = Report[Down] // 提取天数对应的秒数 VAR Days = IF(SEARCH("d", DownText, 1, 0) > 0, VALUE(LEFT(DownText, SEARCH("d", DownText)-1)) * 86400, 0) // 提取小时对应的秒数 VAR Hours = VAR HourPos = SEARCH("h", DownText, 1, 0) VAR StartPos = IFERROR(SEARCH(" ", DownText, 1, 0) + 1, 1) RETURN IF(HourPos > 0, VALUE(MID(DownText, StartPos, HourPos - StartPos)) * 3600, 0) // 提取分钟对应的秒数 VAR Minutes = VAR MinPos = SEARCH("m", DownText, 1, 0) VAR PrevSpacePos = IFERROR(SEARCH(" ", DownText, SEARCH("h", DownText, 1, 0)), IFERROR(SEARCH(" ", DownText, 1, 0), 0)) VAR StartPos = PrevSpacePos + 1 RETURN IF(MinPos > 0, VALUE(MID(DownText, StartPos, MinPos - StartPos)) * 60, 0) // 提取秒数 VAR Seconds = VAR SecPos = SEARCH("s", DownText, 1, 0) VAR PrevSpacePos = IFERROR(SEARCH(" ", DownText, SEARCH("m", DownText, 1, 0)), IFERROR(SEARCH(" ", DownText, SEARCH("h", DownText, 1, 0)), IFERROR(SEARCH(" ", DownText, 1, 0), 0))) VAR StartPos = PrevSpacePos + 1 RETURN IF(SecPos > 0, VALUE(MID(DownText, StartPos, SecPos - StartPos)) * 1, 0) RETURN Days + Hours + Minutes + Seconds
这个公式会自动识别字符串中的d/h/m/s单位,提取对应数值并转换为秒后求和,比如31d会计算为2678400秒,1h30m会计算为5400秒。
方案2:Excel中执行运算表达式
如果你使用Excel,除了类似的拆分计算方式,还可以利用EVALUATE函数执行你生成的运算表达式:
- 先在B列用你的
SUBSTITUTE公式生成运算表达式:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"d","*86400"),"h","*3600"),"m","*60"),"s","*1")," ","+")
- 点击「公式」选项卡 → 「名称管理器」,新建名称(比如
CalculateSeconds),在「引用位置」输入:
=EVALUATE(Sheet1!B2)
- 在C2单元格输入
=CalculateSeconds,下拉填充即可得到总秒数。
也可以直接用拆分求和公式,无需生成表达式:
=SUM(IFERROR(VALUE(LEFT(TEXTSPLIT(A2," "),LEN(TEXTSPLIT(A2," "))-1))*XLOOKUP(RIGHT(TEXTSPLIT(A2," "),1),{"d","h","m","s"},{86400,3600,60,1}),0))
内容的提问来源于stack exchange,提问作者kucluk
相关产品推荐
相关产品推荐

