将YYYY-YY转换为年份(日期)

时间:2017-08-08 14:16:11

标签: r as.date

我有一个数据框,其中年份列为财政年度

Year  
2001-02  
2002-03  
2003-04

我如何将其转换为as.Date保持整个事件或仅仅是第二年,即2002,2003,2004。在转换%Y时,我不可避免地得到2001-08-08,2002-08-08,2003-08-08等。

由于

2 个答案:

答案 0 :(得分:1)

library(lubridate)

Year <- c('2001-02', '2002-03', '2003-04')

year(as.Date(gsub('[0-9]{2}-', '', Year), format = '%Y'))

答案 1 :(得分:0)

1)ISOdate 澄清问题,因为它引用了年末和日期我们假设输入是问题中显示的会计年度(另外我们已经添加了&#34; 1999-00& #34;边缘情况)以及年终的月份和日期。我们假设所需的输出是作为Date对象的年终。 (如果这不是预期的问题,你只想将财政年度作为一个数字,那么最后请看注释。)

回到假定的问题,让我们假设,例如,3月31日是年终。下面我们使用Year提取substring的前4个字符,将其转换为数字并添加1.然后我们将其与月份和日期一起传递给ISODate,最后将其转换为日期。没有使用正则表达式或包。

# test inputs

month <- 3
day <- 31
Year <- c("1999-00", "2001-02", "2002-03", "2003-04")

# yearends

as.Date(ISOdate( as.numeric(substring(Year, 1, 4))+1, month, day))
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31"

2)字符串操作使用相同输入的替代解决方案如下。它是类似的,除了我们使用sub一个与减号相匹配的正则表达式,后面两个字符为它们为零长度字符串,转换为数字并添加1.然后它以{可接受的格式格式化一个字符串{1}}使用as.Date并最终应用sprintf。没有包使用。

as.Date

注意:如果您只想将财政年度作为一个数字,那么就是这样:

as.Date(sprintf("%d-%d-%d", as.numeric(sub("-..", "", Year))+1, month, day))
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31"