【问题标题】:Calculate time to or from a fixed hour of the day计算一天中某个固定时间的时间
【发布时间】:2014-05-08 17:03:56
【问题描述】:

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

执行此操作的一种方法是将当前小时与固定小时、昨天的固定小时和今天的固定小时进行比较。

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 的情况下解决这个问题,但我没有找到答案。

【问题讨论】:

  • difftime 很不错。

标签: r datetime time


【解决方案1】:

另一种解决方案使用最大距离为 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() 的问题。

【讨论】:

    【解决方案2】:

    不清楚这是好是坏,但这个公式似乎有效并且简洁:

    dif <- abs(h - h_fixed)
    12 - abs(dif - 12)
    

    也可以写成一行:

    12 - abs(abs(h - h_fixed) - 12)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多