我的日期是117/12/31意味着17/12/31。如何提取第17年并将其粘贴到第20年并将其更改为2017年?对于2000年以前的日期,格式为(例如)89/12/31。在这种情况下,我需要将年份格式设为1989年。
答案 0 :(得分:5)
使用POSIXlt格式,您可以在年份中添加1900,因为它会分别存储日期的各个部分。
df <- c("117/12/01", "102/04/01", "89/12/31")
foo <- as.POSIXlt(as.Date(df, tz="UTC"))
foo$year <- foo$year + 1900
as.Date(foo)
## [1] "2017-12-01" "2002-04-01" "1989-12-31"
答案 1 :(得分:3)
尝试拆分/
,将1900添加到年份部分,然后重新组合和解析。
x <- c("117/12/31", "89/12/31")
/
library(stringr)
parts <- str_split_fixed(x, "/", 3)
mode(parts) <- "integer"
## [,1] [,2] [,3]
## [1,] 117 12 31
## [2,] 89 12 31
parts[, 1] <- parts[, 1] + 1900
## [,1] [,2] [,3]
## [1,] 2017 12 31
## [2,] 1989 12 31
recombined <- apply(parts, 1, paste, collapse = "-")
## [1] "2017-12-31" "1989-12-31"
as.Date(recombined)
## [1] "2017-12-31" "1989-12-31"
答案 2 :(得分:1)
我认为这是一个更简单的解决方案。
df <- c("117/12/01", "102/04/01", "89/12/31")
计算字符串中的字符数,如果字符串的长度大于8,则删除第一个字符。
df <- ifelse(nchar(df)>=9, stringr::str_sub(df, -8), df)
df_dates <- as.Date(df, "%y/%m/%d")
df_dates
#[1] "2017-12-01" "2002-04-01" "1989-12-31"
答案 3 :(得分:0)
另一个
x <- c("117/12/31", "89/12/31")
m <- gregexpr('^1?(?=\\d{2})', x, perl = TRUE)
regmatches(x, m) <- c('19', '20')[nchar(x) - 7]
as.Date(x, '%Y/%m/%d')
# [1] "2017-12-31" "1989-12-31"
答案 4 :(得分:0)
我们可以使用regular expressions
没有循环,甚至可以避开*apply
系列:
x <- c("117/12/01", "102/04/01", "89/12/31")
m <- regexpr("\\d{2,3}",x)#Find the positions and even the values
regmatches(x,f) <- as.numeric(regmatches(x,m)) + 1900 #REPLACE THE VALUES
x
[1] "2017/12/01" "2002/04/01" "1989/12/31"