【问题标题】:How to know if a as.POSIXct date time is AM/PM in r?如何知道 as.POSIXct 日期时间是否是 r 中的 AM/PM?
【发布时间】:2019-11-23 04:56:52
【问题描述】:

我有一个 as.POSIXct 格式的日期和时间列,例如“2019-02-23 12:45”。我想确定时间是 AM 还是 PM,并将 AM 或 PM 添加到日期和时间?

以下代码为表示创建了一个示例数据集:

ID <- data.frame(c(1,2,3,4))
    DATE <- data.frame(as.POSIXct(c("2019-02-25 07:30", "2019-03-25 14:30", "2019-03-25 12:00", "2019-03-25 00:00"),format="%Y-%m-%d %H:%M"))
DATEAMPM <- data.frame(c("2019-02-25 07:30 AM", "2019-03-25 14:30 PM", "2019-03-25 12:00 PM", "2019-03-25 00:00 AM"))
AMPMFLAG <- data.frame(c(0,1,1,0))

test <- cbind(ID,DATE,DATEAMPM,AMPMFLAG)
names(test) <- c("PID","DATE","DATEAMPM","AMPMFLAG")

想要创建如上面代码所示的 DATEAMPM 和 AMPMFLAG 列。

我已经看到通过指定如下参数将“2019-09-23 08:45 PM”形式的字符串转换为 2019-09-23 20:45”,但不要反过来合并 AM /PM 进入日期时间

as.POSIXct(strptime(,format="%Y-%m-%d %I:%M %p"))

感谢您的帮助

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用format获取AM/PM的数据

    test$DATEAMPM <- format(test$DATE, "%Y-%m-%d %I:%M %p")
    test$AMPMFLAG <- +(grepl("PM", test$DATEAMPM))
    test
    
    #  PID                DATE            DATEAMPM AMPMFLAG
    #1   1 2019-02-25 07:30:00 2019-02-25 07:30 AM        0
    #2   2 2019-03-25 14:30:00 2019-03-25 02:30 PM        1
    #3   3 2019-03-25 12:00:00 2019-03-25 12:00 PM        1
    #4   4 2019-03-25 00:00:00 2019-03-25 12:00 AM        0
    

    另请注意,当您将14:30:00 转换为AM/PM 时,它将是02:30 PM 而不是14:30 PM

    【讨论】:

    • 感谢 Ronak,另一个问题: + 在 "+(grepl ("PM", test$DATEAMPM))" 中表示什么?我使用了 ifelse(grepl("PM",test$DATEAMPM),1,0) 并且它有效。好奇“+”是什么意思
    • 这是一个将logical 转换为等效integer 的技巧。 C.f.,+TRUE+FALSE。您可以等效地执行as.integer(grepl(...)),尽管... code-golf。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2011-03-25
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多