2013-04-30 8 views
12

Tôi có một tệp dữ liệu trong đó có ba cột như sau:R - ngày và thời gian lĩnh vực chuyển đổi để POSIXct với định dạng HHMMSS

20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772 
... 

Như là khá rõ ràng đối với mắt người, hai đầu tiên là ngày và giờ. Tôi cần phải chuyển đổi chúng thành một POSIXct (hoặc cái gì khác nếu nó tốt hơn, nhưng kinh nghiệm quá khứ hạn chế của tôi đối phó với timestamps trong R là sử dụng POSIXct). Thông thường, sau khi kéo nó với read.table, tôi sẽ sử dụng:

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S") 

Tuy nhiên, cột thứ hai dường như mất zero hàng đầu của nó, và do đó nó không hoạt động một cách chính xác (có thể thông qua một loại ép buộc?) .

Tôi đã xem Combine date as integer and time as factor to POSIXct in RConverting two columns of date and time data to one, nhưng cả hai đều sử dụng thời gian có dấu phân tách như: và do đó, không có cùng một vấn đề.

Làm cách nào để chuyển đổi các cột này thành POSIXct?

Trả lời

16

Bạn đã rất thân thiết. Sau đây "đơn giản" buộc hai cột đầu tiên được đọc dưới dạng chuỗi ký tự, để lưu các số 0 đầu.

R> df <- read.table(text="20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772", 
+ header=FALSE, colClasses=c("character", "character", "numeric"), 
+ col.names=c("Date", "Time", "Val")) 
R> df 
     Date Time Val 
1 20010101 000000 0.833 
2 20010101 000500 0.814 
3 20010101 001000 0.794 
4 20010101 001500 0.772 

Bây giờ những gì bạn đã cố gắng "chỉ hoạt động":

R> df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S") 
R> df 
     Date Time Val   DateTime 
1 20010101 000000 0.833 2001-01-01 00:00:00 
2 20010101 000500 0.814 2001-01-01 00:05:00 
3 20010101 001000 0.794 2001-01-01 00:10:00 
4 20010101 001500 0.772 2001-01-01 00:15:00 
R> 
3

Bạn chỉ cần nhập dữ liệu như nhân vật:

txt <- "Date Time value 
20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772 
" 

df <- read.table(text=txt, header=TRUE, 
       colClasses=c("character", "character", "numeric")) 

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S") 
+0

Cảm ơn. Tôi chấp nhận câu trả lời mà đến trước, nhưng điều này là đáng kể giống nhau :-) – Flyto

1

Đơn giản chỉ cần bạn có thể sử dụng lubridate gói mà là siêu tuyệt vời và nhanh chóng. cho mục đích của bạn, hãy thử điều này:

df <- read.table(text="20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772", 
        header=FALSE, colClasses=c("character", "character",  "numeric"), 
        col.names=c("Date", "Time", "Val")) 

df$mix <- paste(df$Date, df$Time) 
df$mix <- parse_date_time(df$mix, 'Ymd HMS') 

Chỉ cần bạn phải nạp đúng định dạng cho nó. Tôi thích nó để as.POSICct bởi vì nó linh hoạt hơn nhiều và bạn có các chức năng khác để làm việc với các biến thời gian.