Преобразование четырехзначных значений года в тип даты
У меня есть целочисленный столбец в моем наборе данных, который имеет четырехзначные значения года, например:
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)