4

我正在编写一些数据分析软件,我想升级我的原始数据的时基。我的原始数据的时间步长约为 2 分钟。我想将数据扩展到几个数据库表,时间步长为 5 分钟、每小时、每天和每月。我计划从原始数据中运行每一个,以保持我的准确性。

我目前遇到的问题是取一个初始值并找到我想要的最接近的“圆形”时间点,作为我的起点。例如,我将从 13/03/12 00:01:36 作为起点开始,我希望代码找到 13/03/12 00:00:00 作为最近的时间点,因此它将开始计算从那里。对于每个时间点,我想在每一侧采取一半的时间步长。所以 12/03/12 23:57:30 到 13/03/12 00:02:29 将变为 13/03/12 00:00:00。

使用 SQL 查询从 Access 获取数据,日期和值存储在两个并排的数组中。以下是我到目前为止的代码。它会将值向上舍入到 NEXT 5 分钟,而不是向上或向下舍入到 NEAREST 5 mimutes。

Private Sub RateStateScale(ByVal Parameter As Integer, ByVal Timebase As String)

    Dim NewDate(0)
    Dim NewData(0)
    Dim RecordCounter
    Dim MinValue As Date = ScaleDate(0)
    Dim startpoint As String

    For RecordCounter = 0 To ScaleDate.GetLength(0)
        If MinValue > ScaleDate(RecordCounter) Then
            MinValue = ScaleDate(RecordCounter)
        End If
    Next

    Do Until MinValue.Minute Mod 5 = 0
        MinValue = MinValue.AddMinutes(1)
    Loop



End Sub

谢谢你的帮助

4

3 回答 3

10

让我们尝试一些 VB,以获得“四舍五入到最接近 5 分钟”的功能:

' just some date, should be a parameter to your function
Dim mydatetime = new DateTime(2012,3,12,23,57,30)

' split into date + time parts
Dim datepart = mydatetime.Date
Dim timepart = mydatetime.TimeOfDay

' round time to the nearest 5 minutes
timepart = TimeSpan.FromMinutes(Math.Floor((timepart.TotalMinutes+2.5)/5.0) * 5.0)

' combine the parts
Dim newtime = datepart.Add(timepart)
' a function would return this value
于 2012-09-18T14:11:14.333 回答
1

一种可能性如下:

var date = new DateTime(2012,03,12,23,57,30);
var fullFiveMinutes = date.Minute / 5;
// result will be our date rounded down to the previous full five minutes
var result = new DateTime(date.Year, date.Month, date.Day
                          date.Hour, fullFiveMinutes * 5, 0);

// if we add exactly 2.5 minutes to our date variable and the result represents
// another full five minutes we need to round up.
if(date.AddSeconds(2.5 * 60).Minute / 5 != fullFiveMinutes)
    result = result.AddMinutes(5);

这是 C# 代码,我相信你可以翻译它。

于 2012-09-18T13:49:42.000 回答
1

你能做到吗?(非常基本,但它应该给出一个想法)

Dim tValue As Date = ScaleDate(0) 

'find the next highest 5 minute mark
For RecordCounter = 0 To ScaleDate.GetLength(0)              
    If tValue > ScaleDate(RecordCounter) Then                  
        tValue = ScaleDate(RecordCounter)              
    End If          
Next  

Do Until tValue.Minute Mod 5 = 0         
        tValue = tValue.AddMinutes(1)     
Loop

'compare the original value to the next highest.  If more than 2.5 minutes, then subtract 5 minutes
If DateDiff(DateInterval.Second, tValue, MinValue) > 150 Then
    MinValue = tValue.AddMinutes(-5)
Else
    MinValue = tValue
End If
于 2012-09-18T14:11:27.797 回答