Как узнать среднее время из массива в PowerShell

572
cyborgcommando0

Я ссылаюсь на список, который содержит много данных в виде истекшего времени процесса, и я пытаюсь преобразовать его в формат, в котором я могу найти среднее количество истекшего времени.

Данные выглядят примерно так:

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 

Выполнение приведенного выше кода дает мне эту ошибку для каждого объекта в массиве:

Объект измерения: входной объект "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
Вы показываете все времена в массиве, который вы хотите? Я просто запутался, откуда берется ввод 00:02:44. DrZoo 5 лет назад 0
00:02:44 происходит из примера типа сообщений об ошибках, которые я получаю с помощью приведенного выше кода. У меня нет этого конкретного фрагмента в данных ElapsedTime, но вы получите картину. Данные ElapsedTime являются примером данных, с которыми я работаю. cyborgcommando0 5 лет назад 0

2 ответа на вопрос

3
Pimp Juice IT

Вы можете использовать TimeSpan для преобразования данных в допустимый тип времени, а затем использовать .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 Структура

    свойства

    • Seconds: получает компонент секунд интервала времени, представленного текущей структурой TimeSpan.

    методы

    • Duration (): возвращает новый объект TimeSpan, значение которого является абсолютным значением текущего объекта TimeSpan.
cyborgcommando0 - Вам, очевидно, придется вычислить сумму секунд, затем разделить ее на количество объектов в наборе, чтобы получить средние секунды, и затем преобразовать их обратно в длительность. Для вашей непосредственной проблемы, я показал пример того, как преобразовать строку `00: 00: 00` в тип времени, чтобы затем иметь возможность преобразовать его в другой числовой тип данных и тому подобное. Рад помочь, если вы попросите, так что дайте мне знать. Pimp Juice IT 5 лет назад 0
Я никогда не использовал `Measure-Object -Average` с массивом строк` hh: mm: ss` или длительностью по этому вопросу, но вы, возможно, уже знаете, как получить `Measure-Object -Average`, чтобы вернуть среднее значение для набора массивов или чего-то еще. Я должен отойти, но проверю позже. Pimp Juice IT 5 лет назад 0
Вы сделали меня на правильном пути. По какой-то причине я думал, что метод TotalSeconds был всего лишь секундами, а не минутами или часами, и я собираюсь обвинить мой сценарий в отравлении ума. Я изменил код, вставив каждый объект TimeSpan, в следующий: `$ ElapsedTimespanCollection + = $ ElapsedTimeSpanObject.TotalSeconds` Затем я просто сделал приведенный ниже код, и он дает мне то, что мне нужно. `$ FindElapsedTimeSpanAverage = ($ ElapsedTimespanCollection | Measure-Object -Average) .Average`` $ ElapsedTimeSpanAverageObject = New-TimeSpan -Seconds $ FindElapsedTimeSpanAverage` Спасибо cyborgcommando0 5 лет назад 1
0
LotPings

Этот сценарий использует 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