Excel未对齐的时间戳

时间:2014-02-18 16:51:23

标签: excel

[编辑]

我有一个带有两个工作表的Excel工作簿(.xlsx)(工作表1和工作表2)。工作表1有7列数据(每行有大约70k行),而工作表2只有5列,大约250-500行。每个工作表的第一列包含以格式(yyyy-mm-dd_hh:mm:ss)收集数据的时间戳。

差异在于表1中的数据具有间隔8秒的数据点。但是,第2页有零星的数据条目。一个爆发中可能有4个或5个条目(比如5秒间隔),然后在另外几个小时内没有另一个条目。

我想要做的是重新组织工作表2,使时间戳与工作表1对齐。原因是当我在工作表1中绘制数据时,可视化看起来合适,因为数据在整个范围内均匀分布。但是,我无法以相同的方式绘制工作表2中的数据,因为数据点是偶尔出现的。

我对C#感到很自在,并考虑尝试创建一个程序,该程序将读取每个工作表的csv文件并进行批处理......但即使在那里,我仍然有点担心正确的程序会是什么是。有没有办法可以直接在Excel中处理?欢迎任何建议。

1 个答案:

答案 0 :(得分:2)

一点背景知识。我在三张纸上测试了这个。第一张纸有100k日期,间隔为8​​秒。第二张,我有5列300个数据点,第一列包含零星间隔的日期。我决定不对第二张纸进行修改,因此我的输出在第三张纸中用于测试目的。

我们的逻辑是定位小于目标日期的最大值。这样,我们在这个定位日期和下一个日期之间的8秒内。然后我们从第一张表中获取该值的行,然后我们在结果表中将该行用作相同的行号。然后,我们将值从第二张纸“转移”到结果表中的正确行。

我的机器上的运行时间可以忽略不计。希望这也适合你。 请在您的工作簿副本上进行测试。

Sub Align()
    Dim RefWS As Worksheet, ListWS As Worksheet, ResWS As Worksheet
    Dim RngOne As Range, RngTwo As Range
    Dim RngVal As Variant, Elem As Variant
    Dim LRowOne As Long, LRowTwo As Long, LRowThree As Long
    Dim LocRow As Long, RowCt As Long
    Dim PopRng As Range, StartRow As Long

    With ThisWorkbook
        Set RefWS = .Sheets("Sheet1") 'Modify as necessary.
        Set ListWS = .Sheets("Sheet2") 'Modify as necessary.
        Set ResWS = .Sheets("Sheet3") 'Modify as necessary.
    End With

    LRowOne = RefWS.Range("A" & Rows.Count).End(xlUp).Row
    LRowTwo = ListWS.Range("A" & Rows.Count).End(xlUp).Row

    'Make sure to change based on whether you have headers or not.
    Set RngOne = RefWS.Range("A1:A" & LRowOne) 'Modify as necessary.
    Set RngTwo = ListWS.Range("A1:A" & LRowTwo) 'Modify as necessary.

    RngVal = RngTwo.Value
    'Change RowCt to 2 if you have headers.
    RowCt = 1

    For Each Elem In RngVal
        LocRow = Application.Match(CDbl(Elem), RngOne, 1)
        ResWS.Range("A" & LocRow & ":E" & LocRow).Value = ListWS.Range("A" & RowCt & ":E" & RowCt).Value
        RowCt = RowCt + 1
    Next Elem

    'Autopopulate.
    With ResWS
        LRowThree = .Range("A" & Rows.Count).End(xlUp).Row
        Do
        StartRow = .Range("A" & LRowThree).End(xlUp).Row
        If StartRow > 1 Then StartRow = StartRow + 1
        Set PopRng = .Range("A" & StartRow & ":E" & LRowThree)
        .Range("A" & LRowThree & ":E" & LRowThree).Copy
        PopRng.PasteSpecial xlPasteValues
        LRowThree = StartRow - 1
        Loop Until StartRow = 1
    End With

    Application.CutCopyMode = False
End Sub

同样重要的是要注意,如果匹配两个值,它将获得最新值而不是最接近的值。首先让我知道运行此数据后数据会发生什么。

编辑:根据聊天更新代码。