我的表格如下:
t: ([]dt: 2021.10.25T09:30:28 2021.10.25T09:30:32;price:9.99 10.00)
我希望将时间戳舍入到最接近的30秒标记。我试着像这样使用xbar:
update roundedDt: 30 xbar dt.second from t
然而,它似乎破坏了结果。两行的期望结果都应该是09:30:30。
一轮怎么能达到最接近的30秒?
发布于 2021-10-25 22:37:22
Jonathon的答案对于修改舍入是最灵活的,不只是几秒钟,但对于几秒钟的另一种简单解决方案是偏移15:
q)update roundedDt:30 xbar 15+dt.second from t
dt price roundedDt
---------------------------------------
2021.10.25T09:30:28.000 9.99 09:30:30
2021.10.25T09:30:32.000 10 09:30:30
编辑:如果你想要完整的时间戳四舍五入,我会将它转换为易于处理的时间戳,并调整我的偏移量/xbar来匹配。
q)update roundedDt:30000000000 xbar 15000000000 + `timestamp$dt from t
dt price roundedDt
-----------------------------------------------------------
2021.10.25T09:30:28.000 9.99 2021.10.25D09:30:30.000000000
2021.10.25T09:30:32.000 10 2021.10.25D09:30:30.000000000
2020.10.25T23:59:59.000 9.99 2020.10.26D00:00:00.000000000
2020.10.26T00:00:01.000 10 2020.10.26D00:00:00.000000000
发布于 2021-10-25 18:52:40
您可以尝试如下所示:
update roundedDt:?[(`ss$dt)within(0;14);`time$(`int$`time$dt)-1000*`ss$dt;
?[(`ss$dt)within(15;44);`time$30000+(`int$`time$dt)-1000*`ss$dt;`time$60000+(`int$`time$dt)-1000*`ss$dt]] from t
发布于 2021-10-25 22:14:41
您可以使用xbar
的修改版本,它舍入为最接近的整数,而不是地板:
q)xbar2:{type[y]$x*"j"$y%x:$[16h=abs type x;"j"$x;x]}
q)update roundedDt:xbar2[30;dt.second] from t
dt price roundedDt
---------------------------------------
2021.10.25T09:30:28.000 9.99 09:30:30
2021.10.25T09:30:32.000 10 09:30:30
请注意,因为此函数是在根命名空间中定义的,所以必须使用括号表示法(xbar2[30;dt.second]
)。如果您希望使用中缀表示法(30 xbar2 dt.second
),则需要在.q
命名空间中定义函数,即.q.xbar2:{type[y]$x*"j"$y%x:$[16h=abs type x;"j"$x;x]}
。
xbar2
基于原始的xbar
,但其中xbar
使用了div
,它具有对结果求底的效果,这里使用的是%
,它将产生浮点输出,然后将其转换为一个长整数,该整数将四舍五入为最接近的整数。
https://stackoverflow.com/questions/69716523
复制