首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间序列重采样

时间序列重采样
EN

Stack Overflow用户
提问于 2014-07-07 04:37:49
回答 2查看 263关注 0票数 0

我有一个字典,类似于{:datetime [unix-timestamp] :count [longs]}

:datetime:count中有相同数量的东西。

:datetime没有指定的间隔,通常是滴答数据。我想重新采样数据,以便它们具有定义的间隔,例如5分钟,并汇总范围的:count

示例:

代码语言:javascript
复制
{
   :datetime [timestamp every minute] 
   :count [1 1 1 1 1. . .] 
} 

将其重新采样为

代码语言:javascript
复制
{
   :datetime [timestamp every 5 minutes] 
   :count [5 5 5 5 5 ...] 
}
EN

回答 2

Stack Overflow用户

发布于 2014-07-07 06:06:15

您希望从时间戳向量中获取五分之一的元素,并从计数向量中添加五个计数的组。下面这样的代码就可以做到:

代码语言:javascript
复制
(defn resample [m]
  (let [{dt :datetime ct :count} m
        newdt (map first (partition 5 dt))
        newct (map (partial apply +) (partition 5 ct))]
    {:datetime newdt
     :count newct}))
票数 0
EN

Stack Overflow用户

发布于 2014-07-07 17:54:16

这里有一些花哨的东西,但可能效率不高:

代码语言:javascript
复制
(defn resample-5 [{:keys [datetime count]}]
  (letfn [(floor-5 [dt] (- dt (mod dt (* 5 60 1000))))
          (sum-counts [[time pairs]]
                      [time (reduce + (map second pairs))])]
    (let [pairs (partition 2 (interleave datetime count))
          pair-groups (group-by #(floor-5 (first %)) pairs)
          sums (map sum-counts pair-groups)]
      {:datetime (map first sums)
       :count (map second sums)})))

注意它对集合执行了多少操作:interleavepartitiongroup-bymap+reduce,然后再次执行map两次。

这里有一些更高效的东西,它只扫描集合一次:

代码语言:javascript
复制
(defn resample-5 [{:keys [datetime count]}]
  (letfn [(add-tick [result dt c]
                    (if dt
                      (-> result
                          (update-in [:datetime] conj dt)
                          (update-in [:count] conj c))
                      result))]

    (loop [datetimes datetime
           counts count
           rounded-last nil
           count-last 0
           result {:datetime [] :count []}]
      (if (empty? datetimes)
        (add-tick result rounded-last count-last)
        (let [dt (first datetimes)
              c (first counts)
              rounded (- dt (mod dt (* 5 60 1000)))]
          (if (= rounded-last rounded)
            (recur (rest datetimes) (rest counts) rounded (+ count-last c) result)
            (recur (rest datetimes) (rest counts) rounded c (add-tick result rounded-last count-last))))))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24600107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档