我的数据集中有一个整数列,它有四位数的年份值,如:
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?
中实现这一目标答案 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