日期为117/12/31格式

时间:2018-02-05 21:26:14

标签: r date

我的日期是117/12/31意味着17/12/31。如何提取第17年并将其粘贴到第20年并将其更改为2017年?对于2000年以前的日期,格式为(例如)89/12/31。在这种情况下,我需要将年份格式设为1989年。

5 个答案:

答案 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")

第1步:在/

上拆分
library(stringr)
parts <- str_split_fixed(x, "/", 3)
mode(parts) <- "integer"
##      [,1] [,2] [,3]
## [1,]  117   12   31
## [2,]   89   12   31

添加1900

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"