2016-10-06 17 views
0

我有一個像格式化時間strptime時有時失蹤,AM/PM轉換到24小時格式

time_stamp <- c("7/1/2013", "7/1/2013 12:00:30 AM", "7/1/2013 12:01:00 AM", "7/1/2013 12:01:30 AM", "8/1/2013","8/1/2013 11:02:30 PM") 

我想這種格式Date類時間戳載體。我試圖

strptime(time_stamp, format = "%d/%m/%Y %H:%M:%S", tz = "GMT") 

但由於兩個時間戳都有缺失的時候,它會導致NA s,這應該是默認取代:12:00:00。

我可以運行一個循環,例如:

for (i in 1:length(time_stamp)) 
{ 
    if(nchar(time_stamp[i])<11) 
    { 
     time_stamp[i] <- paste(time_stamp[i], " 12:00:00 AM") 
    } 
} 

time_stamp <- format(strptime(time_stamp, format = "%d/%m/%Y %I:%M:%S %p", tz = "GMT"), "%d/%m/%Y %H:%M:%S", tz = "GMT") 

是否有更快,做到這一點更清潔的方式?矢量是大數據集的一部分,所以我不想循環它。

回答

2

或使用位的正則表達式替換,然後流程正常:

as.POSIXct(sub("(\\d{4}$)", "\\1 00:00:00", time_stamp), 
      format = "%d/%m/%Y %H:%M:%S", tz = "GMT") 
#[1] "2013-01-07 00:00:00 GMT" "2013-01-07 12:00:30 GMT" "2013-01-07 12:01:00 GMT" 
#[4] "2013-01-07 12:01:30 GMT" "2013-01-08 00:00:00 GMT" "2013-01-08 11:02:30 GMT" 
+0

謝謝!您能否解釋在上下文中使用的正則表達式? – discipulus

+0

@discipulus - 它基本上只是用'4'數字'\\ 1'加上'00:00:00'替換代表年份'd {4}'的最後4位數字, – thelatemail

3

lubridate::parse_date_time可以採取多種令牌的訂單,有或沒有%

lubridate::parse_date_time(time_stamp, orders = c("dmy IMS p", "dmy")) 
## [1] "2013-01-07 00:00:00 UTC" "2013-01-07 00:00:30 UTC" "2013-01-07 00:01:00 UTC" 
## [4] "2013-01-07 00:01:30 UTC" "2013-01-08 00:00:00 UTC" "2013-01-08 23:02:30 UTC" 

或者使用其truncated參數:

lubridate::parse_date_time(time_stamp, orders = 'dmy IMS p', truncated = 4) 

返回同樣的事情。

相關問題