Как преобразовать целое число в формат даты в R? - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь преобразовать целочисленные данные из моего фрейма данных в формат R в формат даты.

Данные находятся в столбце с именем svcg_cycle внутри фрейма данных orig_svcg_filtered.

Исходные данные выглядят как-токак 200502, 200503 и т. д., и я ожидаю, чтобы превратить его в формат гггг-мм-дд.

Я пытаюсь использовать этот код:

as.Date(orig_svcg_filtered$svcg_cycle, origin = "2000-01-01")

но выводне то, что я ожидал:

[1] "2548-12-15" "2548-12-15" "2548-12-15" "2548-12-15" "2548-12-15" 

в то время как это должно быть 2005-02-01, 2005-03-01 и т. д.

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Мне нравится использовать Regex для устранения проблем с форматированием строк.as.Date по умолчанию проверяет только несколько стандартных форматов даты, таких как ГГГГ-ММ-ДД.origin используется, когда у вас есть целочисленная дата (т.е. секунды от некоторой контрольной точки), но в этом случае ваша дата на самом деле не является целочисленной датой, а просто датой, отформатированной в виде строки целых чисел.

Мы просто разделяем месяц и день тире и добавляем день, в данном случае первое число месяца, чтобы сделать его действительной датой (у вас должен быть день, чтобы сохранить его как объект даты в R).Бит Regex фиксирует первые 4 цифры в первой группе и последние две цифры во второй группе.Затем мы объединяем две группы, разделенные тире, вместе с днем.

as.Date(gsub("^(\\d{4})(\\d{2})", "\\1-\\2-01", x))

[1] "2005-02-01" "2005-03-01"

В этом случае вам не нужно указывать format, поскольку YYYY-MM-DD является одной из стандартныхformat as.Date проверяет, однако, аргумент format равен format = "%Y-%m-%d"

0 голосов
/ 16 сентября 2018

Если у вас есть

x <- c(200502, 200503)

, то

as.Date(x, origin = "2000-01-01")

говорит R, что вы хотите дни 200, 502 и 200, 503 дней после 2000-01-01.С help("as.Date"):

as. Дата будет принимать числовые данные (количество дней с начала эпохи), но только если указано происхождение.

Итак, целое числоданные дают дни после предоставленного источника, а не какой-то числовой код для таких дат, как 200502 для "2005-02-01".

То, что вы хотите, это

as.Date(paste(substr(x, 1, 4), substr(x, 5, 6), "01", sep = "-"))

# [1] "2005-02-01" "2005-03-01"

paste(substr(x, 1, 4), substr(x, 5, 6), "01", sep = "-")

part берет ваши целые числа и создает строки типа

# [1] "2005-02-01" "2005-03-01"

Тогда as.Date() знает, как с ними обращаться.

В качестве альтернативы вы можете сделать что-то вроде

as.Date(paste0(x, "01"), format = "%Y%m%d")

# [1] "2005-02-01" "2005-03-01"

Он просто вставляет "01" в каждый элемент (для дня), преобразует в символ и сообщает as.Date() в каком формате считать дату.(См. help("as.Date") и help("strptime")).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...