将四位数年份值转换为日期类型

时间:2015-05-15 09:20:38

标签: r date

我的数据集中有一个整数列,它有四位数的年份值,如:

 2001 2002 2002 2002 2003 2005 

我正在尝试将四位数年份值转换为日期类型。

我正在使用的代码是:

year <- as.Date(as.character(data_file$evtYear), format = "%Y")

但输出是:

"2001-05-15" "2002-05-15" "2002-05-15" "2002-05-15" "2003-05-15" "2005-05-15"

这是错误的输出。它在一个日期(2001年和15年)给出了两年的价值。

我只想将我的四位数年份从原始数据转换为日期类型中的“年份”。预期的出局很简单:

2001 2002 2002 2002 2003 2005 

但他们的班级应该是日期类型。

如何在R?

中实现这一目标

4 个答案:

答案 0 :(得分:15)

根据评论,结果是提问的人不需要将数字年更改为"Date"课程;然而,问题是如何做到这一点,所以这是一个答案。

以下是从4位数字年份创建"Date"类对象的几种方法。全部使用as.Date

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)

1)ISOdate

as.Date(ISOdate(yrs, 1, 1))  # beginning of year
as.Date(ISOdate(yrs, 12, 31))  # end of year

这个ISOdate解决方案有点棘手,因为它创建了一个中间POSIXct对象,因此可能存在时区问题。您可能更喜欢以下之一。

2)粘贴

as.Date(paste(yrs, 1, 1, sep = "-")) # beginning of year
as.Date(paste(yrs, 12, 31, sep = "-")) # end of year

3)zoo :: as.yearmon

library(zoo)

as.Date(as.yearmon(yrs)) # beginning of year
as.Date(as.yearmon(yrs) + 11/12, frac = 1) # end of year

注意:如果y是上述任何一项的结果,那么format(y, "%Y")会给出字符年,as.numeric(format(y, "%Y"))会给出数字年份。

答案 1 :(得分:8)

正如OP已经认识到的那样,仅仅一年不能构成有效日期,因为未指定月份和日期。

但是,ymd()包中的某些日期和日期时间转换函数(例如parse_date_time()lubridate会识别参数truncated以允许解析不完整的日期:

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
lubridate::ymd(yrs, truncated = 2L)
[1] "2001-01-01" "2002-01-01" "2002-01-01" "2002-01-01" "2003-01-01" "2005-01-01"

这些年份已于1月1日完成,以确定有效日期。结果是类Date

答案 2 :(得分:1)

一个重要的回答:

  library(lubridate)
  year <- ymd(sprintf("%d-01-01",data_file$evtYear))

答案 3 :(得分:0)

你可以这样做:

library(lubridate)
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
yr <- as.Date(as.character(yrs), format = "%Y")
y <- year(yr)

输出:

2001 2002 2002 2002 2003 2005