首页 > 解决方案 > PHP - 基于日期时间间隔的数组值的平均值

问题描述

我有以下内容:

[1]=>
array(4) {
    ["id"]=>
    int(1)
    ["sensorId"]=>
    int(52)
    ["dateTime"]=>
    string(20) "2018-03-04T22:40:32Z"
    ["value"]=>
    float(50)
  }
[2]=>
array(4) {
    ["id"]=>
    int(1)
    ["sensorId"]=>
    int(52)
    ["dateTime"]=>
    string(20) "2018-03-04T22:49:32Z"
    ["value"]=>
    float(40)
  }
[3]=>
array(4) {
    ["id"]=>
    int(1)
    ["sensorId"]=>
    int(52)
    ["dateTime"]=>
    string(20) "2018-03-04T23:05:32Z"
    ["value"]=>
    float(10)
  }
[4]=>
array(4) {
    ["id"]=>
    int(1)
    ["sensorId"]=>
    int(52)
    ["dateTime"]=>
    string(20) "2018-03-04T23:25:32Z"
    ["value"]=>
    float(65)
  }

我想获得每个时间间隔(在这种情况下为小时)的平均值,所以:

在此处输入图像描述

我找不到我需要使用什么样的功能组合来解决这个问题。

标签: phparraysdatetimeaverageintervals

解决方案


这不是性能方面的最佳解决方案,但您可以从它开始。按日期对值进行分组,最后计算平均值。

$values = [
    [
        "id" => 1,
        "sensorId" => 52,
        "dateTime" => "2018-03-04T22:40:32Z",
        "value" => 50.0
    ],
    [
        "id" => 1,
        "sensorId" => 52,
        "dateTime" => "2018-03-04T22:49:32Z",
        "value" => 40,
    ],
    [
        "id" => 1,
        "sensorId" => 52,
        "dateTime" => "2018-03-04T23:05:32Z",
        "value" => 10,
    ], 
    [
        "id" => 1,
        "sensorId" => 52,
        "dateTime" => "2018-03-04T23:25:32Z",
        "value" => 65,
    ],
];

$groupedValues = [];

foreach ($values as $value) {
    $dateKey = (new DateTime($value['dateTime']))->format('Y-m-d H');

    if (empty($groupedValues[$dateKey])) {
        $groupedValues[$dateKey] = [
            'total' => $value['value'],
            'count' => 1
        ];
    } else {
        $groupedValues[$dateKey]['total'] += $value['value'];
        $groupedValues[$dateKey]['count'] += 1;
    }
}

foreach ($groupedValues as $date => $group) {
    $average = $group['total'] / $group['count'];
    echo "{$date} = {$average} \n";
}

结果:

2018-03-04 22 = 45 
2018-03-04 23 = 37.5 

沙盒


推荐阅读