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

Lea*_*neR 23 r date

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

 2001 2002 2002 2002 2003 2005 
Run Code Online (Sandbox Code Playgroud)

我试图将四位数年份值转换为日期类型.

我正在使用的代码是:

year <- as.Date(as.character(data_file$evtYear), format = "%Y")
Run Code Online (Sandbox Code Playgroud)

但输出是:

"2001-05-15" "2002-05-15" "2002-05-15" "2002-05-15" "2003-05-15" "2005-05-15"
Run Code Online (Sandbox Code Playgroud)

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

我只想将我的四位数年份从原始数据转换为Date类型中的'Year'.预期的出局很简单:

2001 2002 2002 2002 2003 2005 
Run Code Online (Sandbox Code Playgroud)

但是他们的类应该是Date类型.

如何在R中实现这一目标?

G. *_*eck 19

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

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

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
Run Code Online (Sandbox Code Playgroud)

1)ISO日期

as.Date(ISOdate(yrs, 1, 1))  # beginning of year
as.Date(ISOdate(yrs, 12, 31))  # end of year
Run Code Online (Sandbox Code Playgroud)

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

2)粘贴

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

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
Run Code Online (Sandbox Code Playgroud)

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


Uwe*_*Uwe 11

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

然而,一些日期和日期时间转换功能,例如ymd(),parse_date_time()lubridate包装识别参数truncated允许不完整的日期的解析:

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

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


小智 7

你可以做:

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

输出:

2001 2002 2002 2002 2003 2005
Run Code Online (Sandbox Code Playgroud)

  • `lubridate::year()` 以十进制数形式返回日期时间对象的年份元素。所以,`y` 与 `yrs` 相同。有效日期始终标识特定日期,例如,通过给出年、月和日期。`help("as.Date")` 说: *如果日期字符串没有完全指定日期,则返回的答案可能是系统特定的。最常见的行为是假设缺少的年、月或日是当前的年、月或日。* 因此,结果取决于语句的执行时间,从而导致随机结果。例如,在我的系统上(在撰写本文时),`yr` 是 `2001-01-28`,等等。 (2认同)

Mik*_*ise 2

润滑的答案:

library(lubridate)
year <- ymd(sprintf("%d-01-01",data_file$evtYear))
Run Code Online (Sandbox Code Playgroud)