如何强制Duration.FromText识别特定支持的格式?

时间:2015-12-02 17:01:02

标签: excel powerbi powerquery m

问候心爱的同志们,

我有文本格式HHHH:MM:SS的持续时间数据。

当我使用Duration.FromText()函数时,它会将3873:05:43转换为3873.05:42:00,这是不正确的。

它会在4161:51:05以及中心段大于30的所有值上返回错误。

根据文档here [-]hh:mm[:ss]是一个有效的格式选项,但它没有提供有关如何应用格式掩码的提示,以便正确解析文本。

如何让Duration.FromText()正确解释3873:05:43

2 个答案:

答案 0 :(得分:2)

如果在一行中,您可以这样做:

TransfromDur = Table.TransformColumns(Source, {{"Column1", each #duration(0,Number.From(Text.Split(_,":"){0}),Number.From(Text.Split(_,":"){1}),Number.From(Text.Split(_,":"){2})), type duration}})

你将从3873:05:43获得161.09:05:43

我们的想法是通过“:”符号将文本分解为小时,分钟和秒,然后将结果提供给#duration(天,小时,分钟,秒)

AFAIK,这种符号[ - ] hh:mm [:ss]在将其转换为持续时间时仅允许两位数小时。

或者您可以分几步完成:

let
    Source = Excel.CurrentWorkbook(){[Name="dftext"]}[Content],
    SplitIt = Table.SplitColumn(Table.TransformColumnTypes(Source, {{"Column1", type text}}),"Column1",Splitter.SplitTextByDelimiter(":"),{"Column1.1", "Column1.2", "Column1.3"}),
    ChangeType = Table.TransformColumnTypes(SplitIt,{{"Column1.1", Int64.Type}, {"Column1.2", Int64.Type}, {"Column1.3", Int64.Type}}),
    AddDur = Table.AddColumn(ChangeType, "Column1", each #duration(0,[Column1.1],[Column1.2],[Column1.3])),
    RemCols = Table.RemoveColumns(AddDur,{"Column1.1", "Column1.2", "Column1.3"})
in
    RemCols

答案 1 :(得分:1)

似乎Duration.FromText("0.3873:05:43")正常工作并返回与#duration(0, 3873, 05, 43)相同的值。

我会将此添加到我们的bug backlog中。对不起,你遇到了这个问题!

不看代码我不太清楚3873:05:43发生了什么。我们可以修复功能或更新文档。

更新(从一年前开始):我们在内部对此进行了反复讨论,并决定记录允许的范围:

  

此功能可以解析以下格式:

(-)hh:mm(:ss(.ff))
(-)ddd(.hh:mm(:ss(.ff))) 
     
      
  • ddd:天数。
  •   
  • hh:0到23之间的小时数。
  •   
  • mm:分钟数,介于0到59之间。
  •   
  • ss:秒数,介于0到59之间。
  •   
  • ff:秒数,介于0到9999999之间。
  •   
     

(所有范围都包括在内)

此新文档已在Power Query / Power BI Desktop中发布,它将在某个时间进入MSDN ......