Преобразование четырехзначных значений года в тип даты

У меня есть целочисленный столбец в моем наборе данных, который имеет четырехзначные значения года, например:

 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 

Но их класс должен быть типа Date.

Как добиться этого в R?

Ответ 1

На основании комментариев выяснилось, что человеку, задающему вопрос, не нужно было менять числовой год на "Date" class; тем не менее, вопрос спрашивает, как это сделать, поэтому вот ответ.

Вот несколько способов создания объекта класса "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")) - числовой год.

Ответ 2

Как уже признано 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 января, чтобы сделать действительную дату. Результат имеет класс Date.

Ответ 3

Ответ на lubridate:

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

Ответ 4

Вы можете сделать:

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

Ответ 5

Вы можете сделать следующее:

dates <- as.Date("1965", "%Y")
format(dates,format = "%Y")
class(dates)