如何在 PowerShell 中从数组中查找平均时间

如何在 PowerShell 中从数组中查找平均时间

我正在引用一个列表,其中包含大量以某个过程的经过时间形式呈现的数据,我正在尝试将其转换为一种可以找到平均经过时间的格式。

数据看起来是这样的:

ElapsedTime
0 hours, 1 minutes, 14 seconds
0 hours, 16 minutes, 2 seconds
0 hours, 4 minutes, 0 seconds
0 hours, 11 minutes, 59 seconds

因此,我将上述数据导入到变量中,并使用以下公式提取数值数据:

$ElapsedHours, $ElapsedMinutes, $ElapsedSeconds = $TimeElapsed -split ', ' -split ' ' | Select -Index 0,2,4

从那里我将值分配给一个变量和一个 New-TimeSpan 实例:

$ElapsedTimeSpanObject = New-TimeSpan -Hours $ElapsedHours -Minutes $ElapsedMinutes -Seconds -$ElapsedSeconds

这对我来说是比较棘手的部分。上面的两个代码示例都发生在 Foreach 循环中,我已经创建了一个空白数组。创建 timespan 对象后,将其插入数组并查看下一个 ElapsedTime 值。

我想要找到整个数组的平均值。

当我执行当前代码尝试查找平均值时,出现错误。这是我使用的代码:

$ElapsedTimespanCollection | Measure-Object -Average

执行上述代码会导致数组中每个对象出现以下错误:

Measure-Object:输入对象“00:02:44”不是数字。第 1 行,字符:30 + $ElapsedTimespanCollection | Measure-Object -Average + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidType:(00:02:44:TimeSpan) [Measure-Object],PSInvalidOperationException + FullyQualifiedErrorId:NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand

那么我该如何将这些时间测量值转换或格式化为我可以检查其平均值的东西呢?

答案1

您可以使用时间跨度将数据转换为有效的时间类型,然后使用.TotalSeconds属性将字符串转换hh:mm:ss为时间格式,然后您可以获得数字总秒数等。还有其他方法特性您应该能够利用这里来提供帮助。

$ElapsedHours, $ElapsedMinutes, $ElapsedSeconds = $TimeElapsed -split ', ' -split ' ' | Select -Index 0,2,4
$ElapsedTimeSpanObject = New-TimeSpan -Hours $ElapsedHours -Minutes $ElapsedMinutes -Seconds -$ElapsedSeconds

## -- $ElapsedTimespanCollection = "00:02:44"
$ElapsedTimespanCollection = [TimeSpan]$ElapsedTimespanCollection 
$ElapsedTime.TotalSeconds

更多资源

  • TimeSpan 结构TimeSpan Structure

    特性

    • 秒:获取当前 TimeSpan 结构所表示的时间间隔的秒部分。

    方法

    • 期间():返回一个新的 TimeSpan 对象,其值为当前 TimeSpan 对象的绝对值。

答案2

此脚本使用带有(捕获组)的 RegEx 从带有此处字符串的内联 csv 中提取小时、分钟和秒。它从所有时间数据中创建 PSCustomObject

## Q:\Test\2018\07\03\SU_1336282.ps1
$TimeLapsed = @"
ElapsedTime
0 hours, 1 minutes, 14 seconds
0 hours, 16 minutes, 2 seconds
0 hours, 4 minutes, 0 seconds
0 hours, 11 minutes, 59 seconds
"@ | ConvertFrom-Csv -Delimiter '|'

$Elapsed = ForEach($row in $TimeLapsed) {
    if ($row -match '(?<HH>\d+) hours, (?<mm>\d+) minutes, (?<ss>\d+) seconds'){
        $TotalSecs = (3600 * $Matches.HH) +
                     (  60 * $Matches.mm) +
                        [int]$Matches.ss
        [PSCustomObject]@{
            Hour     = [int]$Matches.HH
            Minute   = [int]$Matches.mm
            Seconds  = [int]$Matches.ss
            TotalSecs= $TotalSecs
        }
    }
}
$Elapsed
$Elapsed | Measure TotalSecs -Average -Sum -MAx -Min|ft *

示例输出:

> .\SU_1336282.ps1

Hour Minute Seconds TotalSecs
---- ------ ------- ---------
   0      1      14        74
   0     16       2       962
   0      4       0       240
   0     11      59       719



Count Average  Sum Maximum Minimum Property
----- -------  --- ------- ------- --------
    4  498,75 1995     962      74 TotalSecs

相关内容