如果没有自己修理一天,如何在一天无效的情况下获得年份和月份?

时间:2011-10-10 02:22:43

标签: r date

我有一些看起来像这样的数据:

require(zoo)

X <- rbind(c(date='20111001', fmt='%Y%m%d'),
            c('20111031', '%Y%m%d'),
            c('201110', '%Y%m'),
            c('102011', '%m%Y'),
            c('31/10/2011', '%d/%m/%Y'),
            c('20111000', '%Y%m%d'))
print(X)

#      date       fmt     
# [1,] "20111001" "%Y%m%d"
# [2,] "20111031" "%Y%m%d"
# [3,] "201110"   "%Y%m"  
# [4,] "102011"   "%m%Y"  
# [5,] "31/10/2011" "%d/%m/%Y"
# [6,] "20111000" "%Y%m%d"

我只想要年月。我不需要这一天,所以我不担心最后一天是无效的。不幸的是,R是:

mapply(as.yearmon, X[, 'date'], X[, 'fmt'], SIMPLIFY=FALSE)

# $`20111001`
# [1] "Oct 2011"

# $`20111031`
# [1] "Oct 2011"

# $`201110`
# [1] "Oct 2011"

# $`102011`
# [1] "Oct 2011"

# $`31/10/2011`
# [1] "Oct 2011"

# $`20111000`
# Error in charToDate(x) : 
#   character string is not in a standard unambiguous format

我知道通常的答案是确定日期的一部分,例如使用paste(x, '01', sep='')。我认为这不会起作用,因为我事先并不知道日期格式是什么,因此我无法设置日期而不先转换为某种日期对象。

3 个答案:

答案 0 :(得分:5)

假设月份始终在年份之后,并且date中总是两个字符。为什么不用substr提取信息。也许是这样的事情:

lapply(X[,'date'], 
  function(x) paste(month.abb[as.numeric(substr(x, 5, 6))], substr(x, 1, 4))
  )

答案 1 :(得分:3)

如果您不需要,则无需在格式中指定日期。仔细阅读?strptime。详细信息部分的第二段说:

  

每个输入字符串        根据指定的格式进行处理:any        尾随字符被忽略。

所以调整你的格式,一切都应该有用。

X <- rbind(c(date='20111001', fmt='%Y%m'),
           c('20111031', '%Y%m'),
           c('201110',   '%Y%m'),
           c('102011',   '%m%Y'),
           c('20111000', '%Y%m'))
mapply(as.yearmon, X[, 'date'], X[, 'fmt'], SIMPLIFY=FALSE)

答案 2 :(得分:0)

假设我总是给出约会(而且从来没有时间),并且任何非法的“日”都不到61,我可以通过将提供的日期视为“秒”来保证合法日期如下用第1天替换所提供的日期。

require(stringr)

safe_date <- str_c('01', X[, 'date'])
safe_fmt <- str_c('%d', str_replace(X[, 'fmt'], '%d', '%S'))

mapply(as.yearmon, safe_date, safe_fmt, SIMPLIFY=FALSE)

# $`0120111001`
# [1] "Oct 2011"

# $`0120111031`
# [1] "Oct 2011"

# $`01201110`
# [1] "Oct 2011"

# $`01102011`
# [1] "Oct 2011"

# $`0131/10/2011`
# [1] "Oct 2011"

# $`0120111000`
# [1] "Oct 2011"