2014-09-21 18 views
5

Câu hỏi của tôi xuất phát từ this question. Câu hỏi có chuỗi ký tự sau.Chuyển đổi chr "00:00:00" sang ngày giờ "00:00:00"

x <- "2007-02-01 00:00:00" 
y <- "02/01/2007 00:06:10" 

Nếu bạn cố chuyển đổi chuỗi này thành đối tượng ngày tháng, điều gì đó vui nhộn xảy ra.

Đây là mẫu từ câu trả lời của @ nrusell.

as.POSIXct(x,tz=Sys.timezone()) 
[1] "2007-02-01 EST" 

as.POSIXct(y,format="%m/%d/%Y %H:%M:%S",tz=Sys.timezone()) 
[1] "2007-02-01 00:06:10 EST" 

Như bạn thấy, 00:00:00 biến mất khỏi ví dụ đầu tiên. @Richard Scriven đã để lại ví dụ sau trong cuộc thảo luận của chúng tôi bằng cách sử dụng lubridate.

dt <- as.POSIXct("2007-02-01 00:00:00") 
hour(dt) <- hour(dt)+1 
dt 
[1] "2007-02-01 01:00:00 EST" 
hour(dt) <- hour(dt)-1 
dt 
[1] "2007-02-01 EST" 

Một lần nữa, 00:00:00 biến mất. Tại sao R tránh giữ 00:00:00 trong đối tượng lớp ngày sau khi chuyển đổi? Làm thế nào chúng ta có thể giữ 00:00:00?

+0

gì thậm chí còn nhiều hơn nữa kỳ lạ là nếu bạn làm 'n <- now()' và sau đó sử dụng 'hou r <-', 'phút <-' và' giây <-' để đưa tất cả xuống 0, nửa đêm thực sự vẫn còn. Wackiness. Điều này có thể là "không hoàn hảo" với xử lý ngày tháng trong R. –

+2

@RichardScriven: Tôi cho rằng đó là sự không hoàn hảo trong lubridate. Vấn đề của OP không thực sự là vấn đề. Nó tương tự như tranh luận rằng đó là một vấn đề mà một số 1 không in các số 0 ở bên phải của số thập phân. –

+1

@JoshuaUlrich Nhưng nửa đêm là một thời gian thực tế trong ngày, vì vậy nó không nên được in như vậy? –

Trả lời

5

Nó chỉ là print loại bỏ độ chính xác nếu phần thời gian của ngày là nửa đêm. Đây là nội dung được giải thích trong trợ giúp ??strftime, đặc biệt là thông số định dạng:

Chuỗi ký tự. Giá trị mặc định là "% Y-% m-% d% H:% M:% S" nếu thành phần có thành phần thời gian không phải là nửa đêm và "% Y-% m-% d" nếu không

Một ý tưởng là để xác định lại phương pháp S3 print cho đối tượng POSIXct:

print.POSIXct <- function(x,...)print(format(x,"%Y-%m-%d %H:%M:%S")) 

Bây giờ ví dụ của bạn nếu in của bạn ngày x của bạn (với phần nửa đêm) bạn nhận được:

x <- "2007-02-01 00:00:00" 
x <- as.POSIXct(x,tz=Sys.timezone()) 
x 
[1] "2007-02-01 00:00:00" 
+4

Mã ảnh hưởng đến việc in thực tế là trong' format.POSIXlt', trong đó các cuộc gọi 'format.POSIXct', mà các lệnh' print.POSIXct' - 'if (tất cả (lần [! is.na (lần)] == 0)); "% Y-% m-% d"; ' – thelatemail

Các vấn đề liên quan