4

私はいくつかのデータ分析ソフトウェアを書いています。生データのタイムベースをアップスケールしたいと思います。私の生データのタイムステップは約2分です。データを5分、時間、日、月のタイムステップでいくつかのデータベーステーブルにスケーリングしたいと思います。精度を維持するために、これらのそれぞれを生データから実行する予定です。

私が現在抱えている問題は、初期値を取得し、それに最も近い「ラウンド」時点を開始点として見つけることです。たとえば、ポイント13/03/12 00:01:36を開始ポイントとして開始します。コードで、最も近い時点として13/03/12 00:00:00を見つけて、計算を開始します。そこから。それぞれの時点で、それぞれの側で時間ステップの半分を取りたいと思います。したがって、12/03/1223:57:30から13/03/1200:02:29は13/03/1200:00:00になります。

データはSQLクエリを使用してAccessから取得され、日付と値は2つの並列配列に格納されます。以下はこれまでの私のコードです。値は、最も近い5分まで上下するのではなく、次の5分まで切り上げられます。

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

「最も近い5分に丸める」機能のために、いくつかのVBを試してみましょう。

' 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

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 に答える