我在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,但答案逃避我。
另一个解决方案使用最大距离为12的事实:
d3 <- ifelse(abs(h-h_fixed)<12, abs(h-h_fixed), 24-(abs(h-h_fixed)))
all.equal(d1, d3)
所以如果时间在fixed_hour的12小时内,这就是我们的答案。如果不是,那么它就是我们想要的答案的"补充"。因为我们只对距离感兴趣,所以时间是离昨天更近还是离明天更近并不重要。不确定这是否更优雅,但它确实解决了不使用pmin()
的问题。
不清楚这是好是坏,但这个公式似乎有效,它很简洁:
dif <- abs(h - h_fixed)
12 - abs(dif - 12)
也可以写成一行:
12 - abs(abs(h - h_fixed) - 12)