Мне нужно изменить формат даты с «xx time ago», например: год назад, 1 неделю назад, на «% Y /% m /% d» - PullRequest
0 голосов
/ 31 марта 2019

У меня есть данные, собранные из Интернета. Формат столбца даты похож на «1 месяц назад», «2 года назад», «4 дня назад», и мне нужно изменить этот формат.

Я пробовал это:

googleR$`Date/Time` <- as.Date.character(googleR$`Date/Time`, 
                                         format = format(googleR$`Date/Time`), 
                                         tryFormats = c("%d/%m/%Y"))

но это дало мне сегодняшнюю дату только для всех записей

также я пробовал много других вещей, но появляется та же ошибка

"строка символов не в стандартном однозначном формате"

вот данные, которые я пытаюсь преобразовать:

format.factor(googleR$`Date/Time`)
 [1] "7 months ago " "2 months ago " "a week ago   " "2 years ago  " "2 years ago  " "5 months ago " "10 months ago"
 [8] "2 years ago  " "4 years ago  " "2 years ago  " "2 years ago  " "11 months ago" "3 years ago  " "3 years ago  "
[15] "2 years ago  " "2 years ago  " "10 months ago" "10 months ago" "a year ago   " "a year ago   " "2 years ago  "
[22] "2 years ago  " "2 years ago  " "2 years ago  " "2 years ago  " "2 years ago  " "3 years ago  " "4 years ago  "
[29] "4 years ago  " "a week ago   " "a week ago   " "2 weeks ago  " "a month ago  " "2 months ago " "5 months ago "
[36] "7 months ago " "7 months ago " "8 months ago " "10 months ago" "10 months ago" "a year ago   " "a year ago   "
[43] "a year ago   " "a year ago   " "a year ago   " "a year ago   " "a year ago   " "2 years ago  " "2 years ago  "
[50] "2 years ago  " "4 years ago  " "6 years ago  "

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Вы можете использовать sub для удаления «назад» из каждого элемента, затем используйте lubridate add_with_rollback следующим образом

library(lubridate)
add_with_rollback(Sys.time(), - as.period(sub("\\s+ago", "", x)))

Результат

"2019-02-28 18:13:18 CET"  "2017-03-31 18:13:18 CEST" "2019-03-27 18:13:18 CET" 

данные

x <- c("1 month ago", "2 years ago", "4 days ago")
0 голосов
/ 31 марта 2019

Возможно, вам придется начать с использования регулярных выражений, чтобы выяснить, какой тип временного интервала у вас есть, а затем перейти оттуда.Мне нравится пакет stringr для этого.Например, если IN является вашей входной строкой, а OUT - вашим желаемым выходом, вы можете сказать:

 if(str_detect(IN, "day")){OUT <- as.numeric(str_extract(IN, "^[0-9]*"))}

Теперь у вас есть количество дней назад, и вы можете сделать что-то вроде

 Sys.Date() - OUT

чтобы получить дату.Затем вы можете делать то же самое в течение месяцев и лет.Это неизбежно будет приблизительным, так как, например, не во всех месяцах одинаковое количество дней, но, похоже, ваши входные данные не слишком точны.

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