【问题标题】:R: Change the date format in R from 01:00 to 24:00 for the same dayR:将R中的日期格式从同一天的01:00更改为24:00
【发布时间】:2021-11-26 18:44:59
【问题描述】:

使用“POSIXct”函数我得到了同一天从 00:00 H 到 23:00 H 的日期格式,但是我需要在同一天从 01:00 H 到 24:00 H 的格式.有没有其他方法可以获取这种格式?

[1] "2016-01-01 01:00:00 -05" "2016-01-01 02:00:00 -05" "2016-01-01 03:00:00 -05" [4] "2016-01-01 04:00:00 -05" "2016-01-01 05:00:00 -05" "2016-01-01 06:00:00 -05" [7] "2016-01-01 07:00:00 -05" "2016-01-01 08:00:00 -05" "2016-01-01 09:00:00 -05" [10] "2016-01-01 10:00:00 -05" "2016-01-01 11:00:00 -05" "2016-01-01 12:00:00 -05" [13] "2016-01-01 13:00:00 -05" "2016-01-01 14:00:00 -05" "2016-01-01 15:00:00 -05" [16] "2016-01-01 16:00:00 -05" "2016-01-01 17:00:00 -05" "2016-01-01 18:00:00 -05" [19] "2016-01-01 19:00:00 -05" "2016-01-01 20:00:00 -05" "2016-01-01 21:00:00 -05" [22] "2016-01-01 22:00:00 -05" "2016-01-01 23:00:00 -05" "2016-01-02 00:00:00 -05" [25] "2016-01-02 01:00:00 -05" "2016-01-02 02:00:00 -05" "2016-01-02 03:00:00 -05"

[1] "2016-01-01 01:00:00 -05" "2016-01-01 02:00:00 -05" "2016-01-01 03:00:00 -05" [4] "2016-01-01 04:00:00 -05" "2016-01-01 05:00:00 -05" "2016-01-01 06:00:00 -05" [7] "2016-01-01 07:00:00 -05" "2016-01-01 08:00:00 -05" "2016-01-01 09:00:00 -05" [10] "2016-01-01 10:00:00 -05" "2016-01-01 11:00:00 -05" "2016-01-01 12:00:00 -05" [13] "2016-01-01 13:00:00 -05" "2016-01-01 14:00:00 -05" "2016-01-01 15:00:00 -05" [16] "2016-01-01 16:00:00 -05" "2016-01-01 17:00:00 -05" "2016-01-01 18:00:00 -05" [19] "2016-01-01 19:00:00 -05" "2016-01-01 20:00:00 -05" "2016-01-01 21:00:00 -05" [22] "2016-01-01 22:00:00 -05" "2016-01-01 23:00:00 -05" "2016-01-01 24:00:00 -05" [25] "2016-01-02 01:00:00 -05" "2016-01-02 02:00:00 -05" "2016-01-02 03:00:00 -05"

【问题讨论】:

  • POSIXt 不会将午夜格式化为 24,因此如果您想要 24,您需要 (a) 从 POSIXt-class 转换为字符串并手动重新格式化;或 (b) 超类它(例如,class(x) <- c("myPOSIX", "POSIXt", "POSIXct")),以便 01-02 00: 打印为 01-01 24:,将其保持为数字。如果你想超级它,你至少需要提供print.myPOSIX,也许还有其他。
  • 您好,我已经尝试手动格式化获取“字符”类,但是,我需要将它以某种可识别的格式作为日期来应用我的其他功能,所以请问是否有任何替代方案来自“POSIXct”。问候
  • 正如我所说,。目前还没有能力用 R 中的现有代码重新映射它。超类方法并不难,真的,它只是需要考虑一些极端情况。

标签: r date


【解决方案1】:

这是一个超一流的想法:

format.myPOSIX <- function(x, tz = "", usetz = FALSE, ...) {
  midnight <- format.POSIXct(x, format = "%H") == "00"
  dayminus1 <- x - 86400
  x[midnight] <- dayminus1[midnight]
  gsub(" 00:", " 24:", format.POSIXct(x, tz = tz, usetz = usetz))
}
print.myPOSIX <- function(x, tz = "", usetz = TRUE, ...) {
  print(format.myPOSIX(x, tz = tz, usetz = usetz))
}

演示:

vec <- seq(as.POSIXct("2020-01-01 22:00:00"), as.POSIXct("2020-01-02 02:00:00"), by = "hour")
vec
# [1] "2020-01-01 22:00:00 EST" "2020-01-01 23:00:00 EST"
# [3] "2020-01-02 00:00:00 EST" "2020-01-02 01:00:00 EST"
# [5] "2020-01-02 02:00:00 EST"
class(vec) <- c("myPOSIX", class(vec))
vec
# [1] "2020-01-01 22:00:00 EST" "2020-01-01 23:00:00 EST"
# [3] "2020-01-01 24:00:00 EST" "2020-01-02 01:00:00 EST"
# [5] "2020-01-02 02:00:00 EST"
data.frame(datetime = vec)
#              datetime
# 1 2020-01-01 22:00:00
# 2 2020-01-01 23:00:00
# 3 2020-01-01 24:00:00
# 4 2020-01-02 01:00:00
# 5 2020-01-02 02:00:00
tibble::tibble(datetime = vec)
# # A tibble: 5 x 1
#   datetime           
#   <dttm>             
# 1 2020-01-01 22:00:00 2020-01-01 22:00:00
# 2 2020-01-01 23:00:00 2020-01-01 23:00:00
# 3 2020-01-01 24:00:00 2020-01-01 24:00:00
# 4 2020-01-02 01:00:00 2020-01-02 01:00:00
# 5 2020-01-02 02:00:00 2020-01-02 02:00:00

【讨论】:

  • 非常感谢,这非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多