2012-02-29 14 views
13

Tôi có một tệp có sinh nhật ở định dạng %d%b%y. Một số ví dụ.Thêm thế kỷ chính xác vào các ngày có năm được cung cấp dưới dạng "Năm không có thế kỷ",% y

# "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59" 

Tôi cố gắng để định dạng lại ngày như

o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d") 

và đây là kết quả

# "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01" 

Đây là ngày sinh nhật và tôi thấy 2054. Từ page này tôi thấy rằng giá trị năm giữa 00 và 68 được mã hóa là 20 cho thế kỷ. Có cách nào để chuyển đổi điều này hay không, trong trường hợp của tôi, tôi chỉ muốn mã hóa từ 00 đến 12 là 20.

Trả lời

21

1) chron. chron sử dụng 30 theo mặc định, do đó, điều này sẽ chuyển đổi chúng chuyển đổi thành Ngày đầu tiên (vì chron không thể đọc các loại ngày tháng) định dạng lại thành ký tự có hai chữ số thành định dạng mà chron có thể hiểu và cuối cùng quay lại Ngày.

library(chron) 
xx <- c("01AUG11", "01AUG12", "01AUG13") # sample data 
as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 

Điều đó cho một cắt 30 nhưng chúng ta có thể có được một cắt 13 sử dụng tùy chọn Sử ký của chron.year.expand:

library(chron) 
options(chron.year.expand = 
    function (y, cut.off = 12, century = c(1900, 2000), ...) { 
     chron:::year.expand(y, cut.off = cut.off, century = century, ...) 
    } 
) 

và sau đó lặp đi lặp lại việc chuyển đổi ban đầu. Ví dụ giả sử chúng ta đã chạy tùy chọn tuyên bố này đã được chúng tôi sẽ nhận được những điều sau với xx của chúng tôi:

> as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 
[1] "2011-08-01" "2012-08-01" "1913-08-01" 

2) ngày chỉ. Đây là một thay thế không sử dụng chron. Bạn có thể muốn thay thế "2012-12-31" với Sys.Date() nếu ý tưởng là ngày khác trong tương lai là thực sự được thiết lập 100 năm trở lại:

d <- as.Date(xx, "%d%b%y") 
as.Date(ifelse(d > "2012-12-31", format(d, "19%y-%m-%d"), format(d))) 

EDIT: chỉ thêm ngày giải pháp.

+4

+1 cho ngày chỉ giải pháp – russellpierce

+0

1 tuy nhiên một caveat đến ngày chỉ giải pháp: đầu ra không còn là một lớp ngày, nhưng một nhân vật, vì vậy số học sẽ yêu cầu back-transforming đầu ra. Oy vey. – AdamO

+0

Nó có dạng 'as.Date (...) 'nên rõ ràng nó thuộc lớp' Date'. –

11

Xem phản hồi từ related thread:

format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d") 
Các vấn đề liên quan