从向量获取日期间隔

时间:2017-07-19 20:08:33

标签: clojure

我有一天在clojure中排序的矢量

(def a [{:day #inst "2017-01-01T21:57:14.873-00:00" :balance 100.00},
        {:day #inst "2017-01-05T21:57:14.873-00:00" :balance -50.00},
        {:day #inst "2017-01-10T21:57:14.873-00:00" :balance -100.00},
        {:day #inst "2017-01-14T21:57:14.873-00:00" :balance 50.00},
        {:day #inst "2017-01-17T21:57:14.873-00:00" :balance -200.00}])

我想获得余额为负数的所有日期间隔。该 期间在下一个位置或何时平衡得到肯定时结束 平衡改变其价值但保持消极,如:

[{:start #inst "2017-01-05T21:57:14.873-00:00"
  :end #inst "2017-01-09T21:57:14.873-00:00"
  :value -50.00},
 {:start "2017-01-10T21:57:14.873-00:00"
  :end "2017-01-13T21:57:14.873-00:00"
  :value -100.00},
 {:start "2017-01-17T21:57:14.873-00:00"
  :value -200.00}]

我找到了thisthis,但我无法适应我的数据。我该怎么办?

1 个答案:

答案 0 :(得分:3)

使用这个尚未实现的函数来欺骗日期,该函数应该减少日期:

(defn dec-date [d] d)

这是解决问题的一种方法:

(->> a
     (partition-by #(-> % :balance neg?))
     (drop-while #(-> % first :balance pos?))
     (mapcat identity)
     (map (juxt :day :balance))
     (partition 2 1)
     (map (fn [[[date-1 val-1] [date-2 val-2]]]
            (if (neg? val-1)
              {:start date-1
               :end   (dec-date date-2)
               :value val-1}
              {:start date-2
               :value val-1}))))) 

;;=> ({:start "05/01", :end "10/01", :value -50.0} {:start "10/01", :end "14/01", :value -100.0} {:start "17/01", :value 50.0})

如果dec-date已正确实施,则第一个:end将是" 09/01"而不是" 10/01"第二个:end将是" 13/01"而不是" 14/01",这将是正确的答案。

现在希望有一个改进的答案可以用于更多边缘案例:

(->> a
     (partition-by #(-> % :balance neg?))
     (drop-while #(-> % first :balance pos?))
     (mapcat identity)
     (map (juxt :day :balance))
     (partition-all 2 1)
     (keep (fn [[[date-1 val-1] [date-2 val-2]]]
             (cond
               (neg? val-1) (cond-> {:start date-1
                                     :value val-1}
                                    date-2 (assoc :end (dec-date date-2)))
               (pos? val-1) nil
               :else {:start date-2
                      :value val-1}))))