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

Convert 12 hour to 24 hour format in R

当我尝试将 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 小时格式。 我的意思是,对于第 3 行,我得到的不是 21:50:49,而是 09:50:49。 我尝试了两种不同的方法来做到这一点。一种使用 data.table 中的 as.ITime,然后还使用 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

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

给你:

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

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

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

%H
Hours as decimal number (00–23). As a special exception strings such as 24:00:00 are accepted for input, since ISO 8601 allows these.

%I
Hours as decimal number (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"