将字符串转换为R中的日期(2005M09至01/09/2005)

时间:2014-05-23 20:31:35

标签: r date

我正在尝试将字符串(例如" 2005M09"," 2005M10"等)转换为R中的日期。我想显示01/09/2005而不是2005M09,01 / 10/2005而不是2005M10等。

有没有一个简单的解决方案来实现这一目标?

提前谢谢!

3 个答案:

答案 0 :(得分:2)

使用strsplit将字符串拆分为“M”。然后粘贴结果年份&白天与“01”一起。最后,使用as.Date。要进行矢量化,请使用sapply

> foo <- c("2005M09","2005M10")
> as.Date(sapply(strsplit(foo,"M"),
  function(xx)paste(xx[1],"-",xx[2],"-01",sep="")))
[1] "2005-09-01" "2005-10-01"

如果您更喜欢问题中的输出格式,请执行以下操作:

> bar <- as.Date(sapply(strsplit(foo,"M"),
  function(xx)paste(xx[1],"-",xx[2],"-01",sep="")))
> format(bar,format="%d/%m/%Y")
[1] "01/09/2005" "01/10/2005"

答案 1 :(得分:2)

看一下lubridate包,它有很多处理日期的功能。一种选择是粘贴类似&#34; D01&#34;到每个日期,然后使用ymd函数:

> ymd( paste0( c('2005M09','2014M05'), 'D01' ) )
[1] "2005-09-01 UTC" "2014-05-01 UTC"

或者像Stephan所建议的那样拆分年份和月份,并使用lubridate函数来使用月份和年份:

> tmp <- strsplit( c('2005M09','2014M05'), 'M' )
> dates <- rep(today(), length(tmp))
> year(dates) <- as.numeric(sapply(tmp, `[`, 1))
> month(dates) <- as.numeric(sapply(tmp, `[`, 2))
> day(dates) <- 1
> dates
[1] "2005-09-01" "2014-05-01"

答案 2 :(得分:1)

您可以使用as.Date()转换为日期,format可以按照您的需要进行打印。查看?strptime以了解如何为format参数构造字符串。

txt <- c("2005M09", "2005M10")
(d <- as.Date(paste0(txt, "01"), format="%YM%m%d"))
#[1] "2005-09-01" "2005-10-01"
format(d, "%d/%m/%Y")
#[1] "01/09/2005" "01/10/2005"

您还可以使用substr创建一个字符串,以便更容易&#34;转换为日期。我认为这些解决方案中的任何一个都比使用strsplitsapply

快得多
d <- as.Date(paste0(substr(txt, 1, 4), substr(txt, 6, 7), "01"), format="%Y%m%d")

实际上,忘记转换为日期,你可以简单地substr输出你想要的东西并将它粘贴在一起然后你想要它(如果这就是你想做的......把日期存储为{{1可能会使其他事情变得更容易。)

Date

或者,这是一个正则表达式解决方案

> paste("01", substr(txt, 6, 7), substr(txt, 1, 4), sep="/")
[1] "01/09/2005" "01/10/2005"

如果速度是一个问题,这是一个基准

> sub("(\\d{4})M(\\d{2})", "01/\\2/\\1", txt)
[1] "01/09/2005" "01/10/2005"

结果:

gsee1 <- function(txt) {
  format(as.Date(paste0(txt, "01"), format="%YM%m%d"), "%d/%m/%Y")
}

gsee2 <- function(txt) {
  format(as.Date(paste0(substr(txt, 1, 4), substr(txt, 6, 7), "01"), 
                 format="%Y%m%d"), "%d/%m/%Y")
}

gsee3 <- function(txt) {
  paste("01", substr(txt, 6, 7), substr(txt, 1, 4), sep="/")
}

gsee4 <- function(txt) {
  sub("(\\d{4})M(\\d{2})", "01/\\2/\\1", txt, perl=TRUE)
}

gsnow <- function(txt) {
  tmp <- strsplit(txt, 'M' )
  dates <- rep(today(), length(tmp))
  year(dates) <- as.numeric(sapply(tmp, `[`, 1))
  month(dates) <- as.numeric(sapply(tmp, `[`, 2))
  day(dates) <- 1
  format(dates, "%d/%m/%Y")
}

stephan <- function(txt) {
  format(as.Date(sapply(strsplit(txt,"M"),
                        function(xx)paste(xx[1],"-",xx[2],"-01",sep=""))),
         format="%d/%m/%Y")
}

identical(gsee1(txt), gsee2(txt))
#[1] TRUE
identical(gsee1(txt), gsee3(txt))
#[1] TRUE
identical(gsee1(txt), gsee4(txt))
#[1] TRUE
identical(gsee1(txt), gsnow(txt))
#[1] TRUE
identical(gsee1(txt), stephan(txt))
#[1] TRUE