簡體   English   中英

將正確的世紀添加到日期中,年份提供為“沒有世紀的年份”,%y

[英]Add correct century to dates with year provided as "Year without century", %y

我有一個%d%b%y格式的生日文件。 一些例如。

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

我試圖將日期重新格式化為

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

這就是結果

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

這些是生日,我看到 2054。從這個頁面我看到 00 到 68 之間的年份值被編碼為 20 世紀。 有沒有辦法切換這個,在我的情況下,我只想將 00 到 12 編碼為 20。

1) 時間 chron 默認使用 30,因此這會將它們首先轉換為 Date(因為 chron 無法讀取這些類型的日期),重新格式化為具有兩位數年份的字符,轉換為 chron 可以理解的格式,最后返回到日期。

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

這給出了 30 的截止值,但我們可以使用 chron 的chron.year.expand選項獲得 13 的截止值:

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, ...)
     }
)

然后重復原來的轉換。 例如,假設我們已經運行了這個選項語句,我們將使用xx獲得以下內容:

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

2) 僅日期 這是一個不使用 chron 的替代方法。 如果想法是未來的日期真的要設置在 100 年前,您可能想用Sys.Date()替換"2012-12-31"

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

編輯:添加僅日期解決方案。

請參閱相關線程的響應:

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

o108$fmtbirth <- as.Date(ifelse(o108$fmtbirth > Sys.Date(), 
                                format(o108$fmtbirth, "19%y-%m-%d"),
                                format(o108$fmtbirth)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM