excel 在Power Query中对24小时内的时间字段求和

jckbn6z7  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(323)

我有一个Excel中的Power Query链接到另一个文件。这个文件有一个时间列。我知道M语言不会自动求和超过24小时而不做一些工作,因为它使用日期时间参考,因此如果我导入25小时的时间,它会恢复2小时到1小时...
在我下面的图像中的第三列中,使用第二行作为参考,实际上应该是47:47:38。我如何获得值高于24小时的示例来显示真实的小时数?
我试过使用duration.hours(#hours()),但由于某种原因,它也不起作用。
同样的数据从源excel文件也在下面

xtfmy6hx

xtfmy6hx1#

Power Query没有自定义格式来显示数据。如果您让它将数据读取为Duration而不是DateTime,它将显示为[d].hh.mm.ss格式,但仍然不显示总小时数。最终,尽管这并不重要,因为即使您的数据被格式化为在Excel中显示总小时数,它实际上是以天+小时+分钟+秒的形式在内部存储的。所以它在Power Query中如何显示并不重要,因为您可以在任何地方使用小时格式输出数据。
现在,如果您需要使用小时数来计算不是另一个Duration的时间,则可以通过执行以下操作来提取小时数

Duration.Days([Your Hours]) * 24 + Duration.Hours([Your Hours])

现在我来看一下,还有一个TotalHours函数,它提供小时数加上mm:ss作为小时数的分数

Duration.TotalHours([Your Hours])
tjvv9vkg

tjvv9vkg2#

Power BI无法很好地处理这种情况。解决方案可能是将持续时间转换为数字,使其具有可加性(以便您可以执行计算和聚合),并在需要可视化时将其转换为所需的格式(HH:MM:SS)。
DurationTime经常被混淆。当读取此类Excel文件时,列的类型通常为DateTime,并在“时间”部分添加日期1899-12-31。您可以将列的数据类型更改为Decimal Number,但Excel中的“零点”不幸的是少了一天(1899-12-30),所以你需要从结果中减去1,以获得持续时间的实际“天数”(即0. 25意味着06:00:00)。
所以你必须对数据进行一些转换。我会在模型中创建一个新列,以获得我需要的最低粒度的持续时间(在你的例子中是秒)。在Power Query Editor中添加一个自定义列来计算以秒为单位的持续时间(其中Column1是原始持续时间列的名称):

Duration in seconds = Duration.TotalSeconds([Column1] - #datetime(1899, 12, 31, 0, 0, 0))

确保此列的数据类型为“整数”(如有必要,请更改)。这里9144秒的计算公式为2 * 3600 + 32 * 60 + 2402:32:24。现在,您可以计算此列的总和,以获得总持续时间(例如,以秒为单位)。但是,当您可视化此列时,不要直接执行此操作,但要采取措施将数据转换为所需的格式。它可以像这样:

Measure Duration = 
    VAR duration_in_seconds = SUM(Sheet1[Duration in seconds])
    VAR hours = ROUNDDOWN ( duration_in_seconds / 3600; 0 )
    VAR minutes = ROUNDDOWN ( MOD ( duration_in_seconds; 3600 ) / 60; 0 )
    VAR seconds = INT ( MOD ( duration_in_seconds; 60 ) )
    RETURN hours & ":" & FORMAT(minutes; "00") & ":" & FORMAT(seconds; "00")

duration_in_seconds变量保存上下文中数据的总持续时间(以秒为单位)。从它我们正在计算hoursminutesseconds,并构造一个字符串以表示所需格式的持续时间。FORMAT用于确保在分钟或秒小于10的情况下有一个前导零。
以下是可视化时所有三列的外观:

希望这有帮助!

dkqlctbz

dkqlctbz3#

上述所有解决方案的问题是,它们不会生成格式为hhh:mm的持续时间输出。
当你把它格式化为字符串时,对这一列的排序将不起作用。我目前也在为这个问题而挣扎。
可惜的是,他们deprecated的格式选项Duration.ToText

Duration.ToText(duration as nullable duration, optional format as nullable text) as nullable text

相关问题