繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM