我正在尝试将字符串(例如" 2005M09"," 2005M10"等)转换为R中的日期。我想显示01/09/2005而不是2005M09,01 / 10/2005而不是2005M10等。
有没有一个简单的解决方案来实现这一目标?
提前谢谢!
答案 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;转换为日期。我认为这些解决方案中的任何一个都比使用strsplit
和sapply
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