r: преобразовать строку в дату

У меня есть такая строка:

201601 
201603 
201604 
201606 
201501

И я хотел бы преобразовать в дату, например:

2016-01
2016-03
2016-04
2016-06
2015-01

Я пробовал:df$month_key=as.Date(df$month_key,format="YYYYmm") Но он запрашивает происхождение, о котором нам не нужно заботиться. Есть ли способ сделать это или, может быть, добавить тире между символами 4 и 5 во всем столбце? Спасибо


person La Machine Infernale    schedule 18.08.2016    source источник
comment
См. stackoverflow.com/questions/13863599/   -  person Wiktor Stribiżew    schedule 18.08.2016


Ответы (1)


Мы можем использовать sub для создания - между первыми 4 символами и следующими 2. Сопоставьте четыре символа (.{4}), поместите их в группы захвата ((...)), а затем следующие 2 символа в другой группе захвата, замените их на обратная ссылка для этих групп (\\1, \\2), а между ними мы добавляем -.

df1$Col <- sub('(.{4})(.{2})', "\\1-\\2", df1$month_key)
df1$Col
#[1] "2016-01" "2016-03" "2016-04" "2016-06" "2015-01"

Другой вариант substr/paste

with(df1, paste(substr(month_key, 1,4), substr(month_key, 5, 6), sep="-"))

Однако у класса Date тоже есть день. Итак, чтобы преобразовать исходный столбец в «Дата», мы можем добавить любой день, возможно, 01, и использовать формат as.Date.

as.Date(paste0(df1$month_key, "01"), "%Y%m%d")

данные

df1 <- structure(list(Col = c(201601L, 201603L, 201604L, 201606L, 201501L
 )), .Names = "month_key", class = "data.frame", row.names = c(NA, -5L))
person akrun    schedule 18.08.2016
comment
Вам не нужно преобразовывать строку в дату, вставляя дефис. Вы также можете рассмотреть возможность использования zoo: library(zoo); as.yearmon("201603", "%Y%m") (к сожалению, lubridate пока этого не делает). Ответы на другой повторяющийся вопрос: stackoverflow.com/questions/6242955/ - person Dannid; 27.02.2019