2016-07-06 122 views
0

当我尝试将12小时转换为24小时时,我无法获得正确的转换。我的脚本(带有示例数据如下)。转换12小时至24小时格式在R

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小时格式。 我的意思是,第三排,而不是21:50:49我得到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") 

我想到了使用数据框,而不是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 

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

+1

您的初始翻译结束了。改为:'dt $ TOD2 < - format(strptime(dt $ Date,“%B%d%Y%I:%M:%S%p”),format =“%H:%M:%S” )'。我切换了%I和%H。 – lmo

+0

我尝试了您的转换,并且最初没有起作用。然后,我意识到在data.table导致问题之前调用lubridate。当我只用data.table运行它时,它按预期运行并给了我正确的答案。谢谢。 – Krishnan

回答

2

视为注释@lmo,你需要使用的,而不是%H%I参数,从?strptime

%H
时间为十进制数(00-23)。由于特殊例外字符串 (如24:00:00)被接受输入,因为ISO 8601允许输入这些字符串。


小时数(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" 
+1

我尝试了您的转换,并且最初无法正常工作。然后,我意识到在data.table导致问题之前调用lubridate。当我只用data.table运行它时,它按预期运行并给了我正确的答案。谢谢。 – Krishnan

1

在这里你去:

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

注意的是,虽然mdy_hms极为方便和照顾的12/24-小时时间对你来说,它会自动分配UTC的时区。如果需要,您可以指定一个不同的。如果您愿意,您可以将df转换为data.table。

相关问题