[英]Convert four digit year values to class Date
我的数据集中有一个整数列,它有四位数的年份值,例如:
c(2001, 2002, 2002, 2002, 2003, 2005)
我尝试使用as.Date
将四位数年份转换为类Date
:
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 年)中给出两年的值。
我只想将我的四位数年份部分从原始数据转换为 'Year' 作为类Date
。 预期输出很简单:
2001 2002 2002 2002 2003 2005
但是他们的班级应该是Date
类型的。
如何在 R 中实现这一点?
根据评论,提出问题的人不需要将数字年份更改为"Date"
类; 尽管如此,问题是如何做到这一点,所以这里是一个答案。
以下是从 4 位数字年份创建"Date"
类对象的几种方法。 全部使用as.Date
:
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
1) ISO 日期
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) 动物园::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"))
给出数字年份。
正如 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
。
你可以做:
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
一个润滑的答案:
library(lubridate)
year <- ymd(sprintf("%d-01-01",data_file$evtYear))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.