Clojure 从向量获取日期间隔

Clojure 从向量获取日期间隔,clojure,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

我在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}]

我发现了,但我无法适应我的数据。我该怎么做呢?

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

(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}))))

尝试使用类似于
(comp neg?:balance)的选择器进行
分区
Chris,它适用于我给出的示例,但是当我有一个只有两个位置的向量
(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}])/code>,此代码不返回任何内容:(我该如何解决它呢?主要的帮助是意识到
(分区2
)去掉了最后一个值。其余的只是解决了诸如
nil
(结束日期)之类的问题。仍然会有问题。例如,我可以看到没有处理零值。