根据 Haskell 中的时间戳将数组拆分为块
Split array into chunks based on timestamp in Haskell
我在 Haskell 中有一组记录(自定义数据类型),我想根据每条记录的时间戳对其进行聚合。笼统地说,每条记录如下所示:
data Record = Record { event :: String,
time :: Double,
from :: Int,
to :: Int
} deriving (Show, Eq)
我使用双精度作为时间戳,因为它与跟踪文件中使用的格式相同。
然后我将它们从 CSV 文件解析为记录数组:[Record]
现在我正在寻找瞬时事件/时间的近似值。所以我想根据时间戳(比如每 1 秒)将数组拆分成几个数组,然后折叠每个较小的数组。
问题是我不知道如何根据记录的值拆分数组。查看 Hoogle 我发现了几个函数,例如 splitEvery
和 splitWhen
,但我迷路了。我考虑过在 (mod time 0.1) == 0
时使用 splitWhen
来分解列表,但即使这样做可行,它也会删除它拆分的元素(我不想这样做)。
我要注意记录的时间间隔不均匀。例如。顺序记录上的时间戳不会相差固定数量。
如果您能推荐一种可以简化此类工作的格式,我非常愿意以其他格式存储数据。
我正在解析的数据的快速示例(来自 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
如果你有 [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
我在 Haskell 中有一组记录(自定义数据类型),我想根据每条记录的时间戳对其进行聚合。笼统地说,每条记录如下所示:
data Record = Record { event :: String,
time :: Double,
from :: Int,
to :: Int
} deriving (Show, Eq)
我使用双精度作为时间戳,因为它与跟踪文件中使用的格式相同。
然后我将它们从 CSV 文件解析为记录数组:[Record]
现在我正在寻找瞬时事件/时间的近似值。所以我想根据时间戳(比如每 1 秒)将数组拆分成几个数组,然后折叠每个较小的数组。
问题是我不知道如何根据记录的值拆分数组。查看 Hoogle 我发现了几个函数,例如 splitEvery
和 splitWhen
,但我迷路了。我考虑过在 (mod time 0.1) == 0
时使用 splitWhen
来分解列表,但即使这样做可行,它也会删除它拆分的元素(我不想这样做)。
我要注意记录的时间间隔不均匀。例如。顺序记录上的时间戳不会相差固定数量。
如果您能推荐一种可以简化此类工作的格式,我非常愿意以其他格式存储数据。
我正在解析的数据的快速示例(来自 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
如果你有 [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