首页 文章

在R中将12小时转换为24小时格式

提问于
浏览
0

当我尝试将12小时转换为24小时时,我没有得到正确的转换 . 我的脚本(示例数据如下) .

library(lubridate)
library(data.table)

# Read Sample Data
df <- data.frame(c("April 22 2016 10:49:15 AM","April 22 2016 10:01:21 AM","April 22 2016 09:06:40 AM","April 21 2016 09:50:49 PM","April 21 2016 06:07:18 PM"))
colnames(df) <- c("Date") # Set Column name
dt <- setDT(df) # Convert to data.table

ff <- function(x) as.POSIXlt(strptime(x,"%B %d %Y %H:%M:%S %p"))
dt[,dates := as.Date(ff(Date))]

当我尝试创建一个名为TOD的新变量时,我得到H:M:S格式的输出而不将其转换为24小时格式 . What I mean is that for the 3rd row, instead of getting 21:50:49 I get 09:50:49. 我尝试了两种不同的方法来做到这一点 . 一个使用as.ITime来自data.table然后也使用strptime . 我用来计算TOD的代码如下 .

dt[,TOD1 := as.ITime(ff(Date))]
dt$TOD2 <- format(strptime(dt$Date, "%B %d %Y %H:%M:%S %p"), format="%I:%M:%S")

我想过尝试使用dataframe而不是data.table来消除在data.table中使用strptime的任何问题,并且仍然得到相同的答案 .

df$TOD <- format(strptime(df$Date, "%B %d %Y %H:%M:%S %p"), format="%I:%M:%S") # Using dataframe instead of data.table

有关如何获得正确答案的任何见解?

2 回答

  • 2

    干得好:

    library(lubridate)
    df$Date <- mdy_hms(df$Date)
    

    请注意,虽然 mdy_hms 非常方便并且为您处理12/24小时,但它会自动将UTC指定为时区 . 如果需要,您可以指定另一个 . 如果愿意,您可以将 df 转换为data.table .

  • 2

    如评论@lmo,您需要使用 %I 参数而不是 %H ,来自 ?strptime

    %H作为十进制数的小时数(00-23) . 作为特殊例外,可以接受24:00:00之类的字符串输入,因为ISO 8601允许这些 . %I小时数十进制数(01-12) .

    strptime("April 21 2016 09:50:49 PM", "%B %d %Y %I:%M:%S %p")
    # [1] "2016-04-21 21:50:49 EDT"
    

相关问题