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

问候亲爱的同志们,

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

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

它在4161:51:05上返回一个错误,并在中心段大于30的所有值上返回。

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

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

看起来像Duration.FromText("0.3873:05:43")应该只是工作,并返回与#duration(0, 3873, 05, 43)相同的值。

我将这个添加到我们的bug积压。 对不起,你碰到这个问题!

没有看代码,我不太清楚3873:05:43发生了什么事情。 我们可以修复该function或更新文档。


更新(从一年前开始):我们在内部来回讨论了这个问题,并决定logging允许的范围:

以下格式可以用这个函数parsing:

 (-)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 …有时候…

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

 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

这个想法是通过用“:”符号分解文本到小时,分钟和秒钟,然后将结果input到#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