2016-07-06 169 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。

相關問題