您如何处理跨周末和非工作时间的时间序列

问题描述

|| 我正在上一个类,该类将包含带有时间戳和多个度量的对象。这些测量通常在每个工作日的08:00至16:00之间进行,但需要灵活。现在,我希望能够做的是指定一个时间间隔,比如说1小时,然后获取平均值。类似于myArrayList.getAvrageHeight()之类的东西,将返回上一小时所有测量值的平均高度。我计划只在列表中保留所需的条目,并删除那些“超时”的条目。 在同一天内执行此操作非常简单。但是我想,当我在星期二早上08.15调用此方法时,myArrayList将包含从星期一开始的45分钟的数据和从星期二开始的15分钟的数据。 我最大的约束之一是测量以任意间隔进行,从1分钟到每秒多次。 到目前为止,每次添加测量值时我都可以计算平均值:
protected void computeAvrages() {

    averageWeight = 0;
    averageSpeed = 0;
    averageHeight = 0;

    for (int i = 0; i < super.size(); i++) {
        averageWeight += super.get(i).getWeight();
        averageSpeed += super.get(i).getSpeed();
        averageHeight += super.get(i).getHeight();
    }

    averageWeight = averageWeight/super.size();
    averageSpeed = averageSpeed/super.size();
    averageHeight = averageHeight/super.size();

}
我的对象如下所示:
public class Car {

    double weight;
    double speed;
    double height;

    int timeStamp;

    public Car(int timeStamp,double weight,double speed,double height) {
    this.timeStamp = timeStamp;
    this.weight = weight;
    this.speed = speed;
    this.height = height;
    }


    public double getWeight() {
        return weight;
    }

    public double getSpeed() {
        return speed;
    }

    public double getHeight() {
        return height;
    }

    public double getTimeStamp() {
        return timeStamp;
    }
}
myArrayList在timeStamp上按升序排序(我可以在此列表上使用二进制搜索),而我计划保留的记录量将在1.000-> 500.000之间,具体取决于流量(一周内每秒约3辆汽车)时间间隔保持为秒,因此当我指定1小时时,我将其存储为3600。 当我调用myArrayList.add(aCar)时,将调用computeAvrages,但我想知道的是以下内容: 我应该如何处理星期一->星期二以及从星期五到星期一的更改? 为了简便起见,我目前将开始和停止时间存储为startHour,startMinute,stopHour和stopMinute,您将如何存储这些时间参考? 对于stackoverflows问题->答案类型,这个问题可能会很复杂,但是我将尝试使其更简单: 您正在看高速公路。汽车路过。每辆经过的汽车都会记录重量,高度和速度。现在,我希望能够指定一个我感兴趣的时间(即08:00至16:00)。只有在工作周内路过的汽车才是有趣的(又名星期一->星期五),我只存储在此期间路过的汽车,但是我仍然会收到在此时间范围以外路过的汽车的通知。 然后,我想计算我的时间范围内经过的汽车的1小时平均值。但是在星期二的08:15,我对仅获取最后15分钟的平均值并不感兴趣,但是我希望将星期一的最后45分钟的平均值与星期二的前15分钟结合起来。所以我上面的问题适用。     

解决方法

您的问题是如此复杂,以至于我(和许多其他人)有更多的问题而不是答案。无论如何,这是我的两分钱,看着您的问题的最后两段。 我将使用以下类: 类别“
CarEvent
”具有三个属性-“
wight,height,speed
” 类
EventTimeStamp
具有两个属性-
Date,ts
。 ts的类型为short,范围为0800至1600。该类应具有两个方法-
subtract(int days,int hours)
add(int days,int hours)
都返回EventTimeStamp的另一个实例。 类
TrafficLog
将所有CarEvents保存在
LinkedListMap
中。 LinkedListMap是Map,它也允许顺序访问,以便您可以执行二进制搜索。映射的键应该是EventTimeStamp的实例 使用此数据结构,您可以在TrafficLog类上实现所需的分析方法。例如,要获得平均值:
public float getAverageTraffic(EventTimeStamp startDate,int durationHours)
{
    EventTimeStamp startEventTS = startDate.subtract(0,durationHours);
    CarEvent startEvent = eventList.get(startEventTS); //there might not be an event at exactly this point. So some tolerance have to be built in to this.
    CarEvent endEvent = eventList.get(startDate);
    return getAverage(startEvent,endEvent);//the two params are part of a linked list,so you can iterate and compute the average.
}
    ,因此,如果我正确理解...从15:15到16:15,您将获得平均值:2.从8:15到9:15,您将获得平均值:3。 您想将时间从16:00到16:15,并将其包括在平均时间8:15至9:00中。 这是编程问题还是数学问题?因为如果这是一个数学问题,看来您应该以(15/60)* 2 +(45/60)* 3来获取早晨的平均值(从8:00到9:00)。 但是,您希望每个小时都这样做,而不仅仅是间隔几天的时间。如果您的样本是从8:30到9:30以及从9:30到10:30,则可能应该对每个样本进行平均。     ,将条目总数(在该时间段内)除以总时间段。 以您的示例为例:如果是星期二上午8:15。您希望从前一天开始的最后15分钟加上最后45分钟来完成该小时的平均值。 (顺便说一句,这确实很奇怪),然后从前一天的最后45分钟获取数据,然后将其与最后15分钟的总和相加即可得出平均值。 就数据结构而言,您的“实时”平均值将包含一个小时的值。在您的时间段内经过一分钟,您将在一侧添加数据,而从另一侧删除数据。这将使您有一个小时,可能需要两天。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...