【问题标题】:Change POSIXct format from YYYY-MM-DD to MM-DD-YYYY in R在 R 中将 POSIXct 格式从 YYYY-MM-DD 更改为 MM-DD-YYYY
【发布时间】:2021-12-09 02:50:09
【问题描述】:

这里是新的 R 用户。我使用 read_xlsx 函数导入 xlxs。我将两列读取为日期,其余列为文本或数字。之后,我无法将“EDD”列从 YYYY-MM-DD 转换为 MM-DD-YYYY。 Str 显示 POSIXct。

MICAP <- read_xlsx("~/Copy of Joint MICAP Report 0700 CDT (004).xlsx", 
sheet = "OPEN ORDERS for MICAP Reporting", col_names = TRUE, , 
col_types = c("text", "text", "text", "text", "text", "text", 
"text", "text", "text", "text", "date", "numeric", "text", 
"date", "text", "text", "text", "text", "text"))

当我调用 str(MICAP) 时,我的列 EDD(日期)显示为 POSIXct,但我无法更改。

我只关心 EDD 更改为 MM/DD/YYYY

【问题讨论】:

  • POSIXt-class 变量在 R 中以一种方式显示,那就是YYYY-MM-DD(通常但不总是HH:MM:SS,基于options("digits.secs"),带/不带小数秒)。如果您希望它以不同的方式显示,您可以 (1) 使用 format(vec, format="%m-%s-%Y") 转换为字符串;或 (2) 对其进行超类化,并使用 R 的 S3 方法调度来更改它在控制台上的显示方式,并希望您找到所有需要的方法来满足您的所有需求。
  • @r2evans,作为答案发布?
  • @JLGRIECO,另一个想法:如果你想对它做类似数字的事情,把它变成一个字符串可能会有问题(diffrangeorder/arrange等),而这样做的理由往往是关于它如何在最终报告/表格中呈现。如果是这种情况,那么format 就是您的答案,由?strptime 中的%-strings 提供。但是,如果您真的希望这只是为了在您的控制台上显示,我建议(1)接受 R 的默认值并克服这种差异,或者(2)您需要对 S3 足够熟悉才能理解我所说的“超级-类”。

标签: r date posixct


【解决方案1】:

这就是我所说的超分类的意思:

format.myPOSIX <- function(x, tz = "", usetz = FALSE, ...) {
  dots <- list(...)
  fmt <- NA
  if ("format" %in% names(dots)) {
    fmt <- dots$format
    dots$format <- NULL
  }
  if (inherits(x, "Date")) {
    if (is.na(fmt)) fmt <- "%m/%d/%Y"
    func <- match.fun("format.Date")
  } else { # POSIXt
    if (is.na(fmt)) fmt <- "%m/%d/%Y %H:%M:%S"
    func <- match.fun("format.POSIXct")
  }
  do.call(func, c(list(x, tz = tz, usetz = usetz), format = fmt, dots))
}
print.myPOSIX <- function(x, tz = "", usetz = FALSE, ...) {
  print(format.myPOSIX(x, tz = tz, usetz = usetz))
}

示例,因为您的数据不可用。

set.seed(42)

datevec <- sort(Sys.Date() + sample(20, size=3))
class(datevec) <- c("myPOSIX", class(datevec))
datevec
# [1] "10/23/2021" "10/27/2021" "11/08/2021"
diff(datevec)
# Time differences in days
# [1]  4 12

psxvec <- sort(Sys.time() + sample(2000, size=3))
class(psxvec) <- c("myPOSIX", class(psxvec))
psxvec
# [1] "10/22/2021 09:55:28" "10/22/2021 09:56:47" "10/22/2021 09:58:02"
diff(psxvec)
# Time differences in mins
# [1] 1.316667 1.250000

显示打印格式为"%m/%d/%Y",但数字运算仍然有效。

这也应该适用于data.frame 和类似的结构:

data.frame(dt = datevec, psx = psxvec)
#           dt                 psx
# 1 10/23/2021 10/22/2021 09:58:02
# 2 10/27/2021 10/22/2021 09:59:21
# 3 11/08/2021 10/22/2021 10:00:36
tibble::tibble(dt = datevec, psx = psxvec)
# # A tibble: 3 x 2
#   dt         psx                
#   <date>     <dttm>             
# 1 2021-10-23 2021-10-22 09:58:02
# 2 2021-10-27 2021-10-22 09:59:21
# 3 2021-11-08 2021-10-22 10:00:36
data.table::data.table(dt = datevec, psx = psxvec)
#            dt                 psx
#     <myPOSIX>           <myPOSIX>
# 1: 10/23/2021 10/22/2021 09:58:02
# 2: 10/27/2021 10/22/2021 09:59:21
# 3: 11/08/2021 10/22/2021 10:00:36

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多