根据Haskell中的时间戳将数组拆分为块

时间:2015-04-14 21:48:45

标签: arrays haskell split aggregate

我在Haskell中有一个记录数组(自定义数据类型),我希望根据每个记录的时间戳来聚合。一般来说,每条记录都是这样的:

data Record = Record { event :: String, 
                       time :: Double, 
                       from :: Int, 
                       to :: Int 
                     } deriving (Show, Eq)

我使用Double作为时间戳,因为它与tracefile中使用的格式相同。

我将它们从CSV文件解析为一系列记录:[Record]

现在我想要获得瞬时事件/时间的近似值。所以我想根据时间戳(例如每1秒)将数组拆分成几个数组,然后在每个较小的数组中折叠。

问题是我无法弄清楚如何根据记录的值拆分数组。看看Hoogle我找到了几个函数,比如splitEverysplitWhen,但我迷路了。我考虑使用splitWhen来分解列表,比如说(mod time 0.1) == 0,但即使这样有效,它也会删除它分裂的元素(我不想这样做)。

我应该注意,记录的时间间隔不均匀。例如。顺序记录的时间戳不会有固定的差异。

我非常愿意以不同的格式存储数据,如果您可以建议一种可以使这种工作更轻松的数据。

我正在解析的数据的快速示例(来自ns2模拟):

r 0.114 1 2 tcp 1000 ________ 2 1.0 5.0 0 2
r 0.240 1 2 tcp 1000 ________ 2 1.0 5.0 0 2
r 0.914 2 1 tcp 1000 ________ 2 5.0 1.0 0 3

1 个答案:

答案 0 :(得分:2)

如果您有[Record],并且希望按特定条件对其进行分组,则可以使用Data.List.groupBy。我假设您的time :: Double,1秒是基本单位,因此time = 1是1秒,time = 100是100秒等,所以将此调整为您所使用的任何系统实际使用:

import Data.List
import Data.Function (on)

isInSameClockSecond :: Record -> Record -> Bool
isInSameClockSecond = (==) `on` (floor . time :: Record -> Integer)
-- The type signature is given for floor . time to remove any ambiguity
-- due to floor's polymorphic type signature.

groupBySameClockSecond :: [Record] -> [[Record]]
groupBySameClockSecond = groupBy isInSameClockSecond