我在 15 分钟的相同间隔内有一系列测量数据/时间序列。此外,我有一个给定的时间段(例如一天、当前周、月、年、(...),我需要按小时、天、月、(...)汇总值。
例如,按天汇总上个月的所有值。
我的方法是在第一步中生成一个具有每个周期所需间隔的临时数组。例如在 PHP 中(PHP 不是必需的,如果它提供更快的方法,我更喜欢 Python 或 Javascript)
$this->tempArray = array(
'2014-10-01T00:00:00+0100' => array(),
'2014-10-02T00:00:00+0100' => array(),
'2014-10-03T00:00:00+0100' => array(),
'2014-10-04T00:00:00+0100' => array(),
(...)
'2014-10-31T00:00:00+0100' => array()
);
在第二步中,我循环遍历每个日期/值对(在此示例中为 4*24*31,(每天 96 个))并将它们分配给我的临时数组。对于每个日期,我都会覆盖 datetime 对象中的一些值。在此示例中,小时和分钟与临时数组中的键匹配。
$insert = array(
'datetime' => $datetime,
'value' => $value
);
if ($interval == "d") {
$this->tempArray[date('Y-m-d\T00:00:sO', $datetime)][] = $insert;
}
在最后一步,我循环遍历临时数组并汇总每个数组。结果,我收到了一个包含 31 个新日期/值对的数组,按每天汇总。这工作正常。但是,有没有更快或更有效的方法?使用这种方法一个月需要将近 0.5 秒。(如果有人对源代码感兴趣,我会添加一个要点)。数据存储在具有 15 个 mio 条目的 mysql 数据库中。
// 编辑:我认为最好的方法是将它与 mysql 分组。
我当前用于从一年中获取数据的 SQL 查询:
SELECT
FROM_UNIXTIME(PointOfTime)) as `date`,
value
FROM data
WHERE EnergyMeterId="0ca64479-bddf-4b91-9e35-bf81f4bfa84c"
and PointOfTime >= unix_timestamp('2013-01-01T00:00:00')
and PointOfTime <= unix_timestamp('2013-12-31T23:45:00')
order by `date` asc;