2011-10-25 28 views
6

Tôi có một tập tin mà định dạng tem thời gian như 25/03/2011 9:15:00 p.m.Parse timestamp với a.m./p.m

Làm thế nào tôi có thể phân tích văn bản này cho một class Date-Time với một trong hai strptime hoặc as.POSIXct?

Đây là những gì hầu hết hoạt động:

> as.POSIXct("25/03/2011 9:15:00", format="%d/%m/%Y %I:%M:%S", tz="UTC") 
[1] "2011-03-25 09:15:00 UTC" 

Dưới đây là những gì không làm việc, nhưng tôi muốn có làm việc:

> as.POSIXct("25/03/2011 9:15:00 p.m.", format="%d/%m/%Y %I:%M:%S %p", tz="UTC") 
[1] NA 

Tôi đang sử dụng R phiên bản 2.13.2 (2011-09-30) trên MS Windows. Địa điểm làm việc của tôi là "C":

Sys.setlocale("LC_TIME", "C") 
+0

'? Strptime' nói rằng'% p' là "chỉ báo AM/PM trong ngôn ngữ". http://stdcxx.apache.org/doc/stdlibref/time-put.html nói trong ngôn ngữ C là AM/PM, vì vậy tôi nghĩ bạn sẽ phải 'sub (" am "," AM ",. ..) 'và' phụ ("pm", "PM", ...) 'trước tiên. (Có lẽ là một biểu hiện thông thường trơn tru sẽ làm tất cả trong một lần.) –

+0

@BenBolker: Tôi nhận được biểu hiện thông thường của bạn ngay tại đây ... :) –

Trả lời

10

Có vẻ như chỉ báo AM/PM không thể bao gồm dấu chấm câu. Hãy thử sau khi xóa dấu chấm câu:

td <- "25/03/2011 9:15:00 p.m." 
tdClean <- gsub("(.)\\.?[Mm]\\.?","\\1m",td) 
as.POSIXct(tdClean, format="%d/%m/%Y %I:%M:%S %p", tz="UTC") 
# [1] "2011-03-25 21:15:00 UTC" 
0

Chỉ cần xem qua điều này, như một tùy chọn khác bạn có thể sử dụng gói stringr.

library(stringr) 
data$date2 <- str_sub(data$date, end = -4) 
# this removes the punctuation but holds onto the A/P values 
data$date2 <- str_c(data$date2, 'm') 
# adds the required m