我在R中有一堆时间戳:
set.seed(42)
t <- sample(1368104620:1399593658, 1000)
t <- as.POSIXlt(t, origin="1970-01-01")
我想知道每个时间戳距当天固定小时的距离(例如,从凌晨5点开始的时间戳有多远?[今天上午5点,昨天或明天])。最大距离应为12。
h <- t$hour + t$min/60 + t$sec/3600
h_fixed <- 5
这样做的一种方法是将当前小时与fixed_hour,昨天的fixed_hour和今天的fixed_hour进行比较。
d1 <- pmin(abs(h-h_fixed),abs(h-h_fixed+24),abs(h-h_fixed-24))
plot(h, d1)
另一种略显煽动性的方法如下:
d2 <- pmin((h_fixed-h) %% 24, (h-h_fixed) %% 24)
plot(h, d2)
all.equal(d1, d2)
他们是一个更优雅的方法吗?我觉得我应该能够在不使用pmin的情况下解决这个问题,但答案就是我。
答案 0 :(得分:2)
另一种解决方案使用最大距离为12:
的事实d3 <- ifelse(abs(h-h_fixed)<12, abs(h-h_fixed), 24-(abs(h-h_fixed)))
all.equal(d1, d3)
因此,如果时间在今天固定时间的12小时内,那就是我们的答案。如果不是,那么它就是补充&#39;我们想要的答案。由于我们只对距离感兴趣,如果时间接近昨天或明天,那真的不重要。不确定这是否更优雅,但它确实解决了问题而不使用pmin()
。
答案 1 :(得分:1)
不清楚这是好还是坏,但这个公式似乎有效并且简洁:
dif <- abs(h - h_fixed)
12 - abs(dif - 12)
它也可以写成一行:
12 - abs(abs(h - h_fixed) - 12)