Clojure 从向量获取日期间隔
我在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
(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
(结束日期)之类的问题。仍然会有问题。例如,我可以看到没有处理零值。