Извлечение дат в любом формате из текста в R

Я хочу извлечь даты из заданного текста, даты могут быть в любом формате 10 апреля 2018 г., 10-04-2018 г., 04.10.2018, 2018/04/10, 04.10.2018, как и в других форматах ....

У меня есть данные новостей и я хочу извлечь даты из текста

например, "Мой друг" выйдет 10 июля 2018 г. или 07 октября 2018 г.

я хочу извлечь дату из данного текста

Пожалуйста помоги

заранее спасибо


person rachit    schedule 03.05.2018    source источник
comment
Что вы уже пробовали?   -  person patL    schedule 03.05.2018
comment
Чудесного решения нет, вам нужно перечислить все форматы, которые могут быть в вашем тексте, и заняться каждым форматом.   -  person byouness    schedule 03.05.2018
comment
Попробуйте начать с регулярных выражений здесь. Если вы застряли, напишите, где вы застряли.   -  person phiver    schedule 03.05.2018
comment
Взгляните на пакет anytime. Функция anydate может быть полезна   -  person Mike H.    schedule 03.05.2018
comment
Обратите внимание, что если вы не знаете формат, возможно, случаи будут неоднозначными (3/4/18 3 апреля или 4 марта?).   -  person iod    schedule 03.05.2018


Ответы (4)


мы извлекаем его с помощью str_extract, а затем с помощью anydate получаем формат

library(anytime)
library(stringr)
anydate(str_extract_all(str1, "[[:alnum:]]+[ /]*\\d{2}[ /]*\\d{4}")[[1]])
#[1] "2018-07-10" "2018-10-07"

данные

str1 <- "My Friend is coming on july 10 2018 or 10/07/2018"
person akrun    schedule 03.05.2018
comment
@rachit Здесь сопоставляются одна или несколько буквенно-цифровых ([[:alnum:]]+), за которыми следует ноль или более пробелов + косая черта ([ /]*), за которыми следуют две цифры, затем пробел или косая черта и четыре цифры. Это в основном соответствует july 10 2018 или 10/07/2018 и преобразуется в класс Date с anydate - person akrun; 05.05.2018

parsedate хорошо работает для этих целей.

library(parsedate)

dates = c("April 10 2018", "10-04-2018", "10/04/2018", "2018/04/10", "04.10.2018")
parsedate::parse_date(dates)

[1] "2018-04-10 UTC" "2018-10-04 UTC" "2018-10-04 UTC" "2018-04-10 UTC" "2018-10-04 UTC"
person Lucas    schedule 07.05.2020

Предлагаемое решение терпит неудачу по непонятной причине со следующей строкой:

txt = «Прямая трансляция, поскольку данные о заработной плате в США показывают значительный рост безработицы после того, как сводные данные PMI показывают, что деловая активность в Великобритании упала до рекордно низкого уровня в марте после блокировки Covid-19» parsedate::parse_date(txt)

person sotnik    schedule 06.05.2020

Parsedate — хороший пакет, но он терпит неудачу со следующей строкой

txt = "Live coverage as American payrolls data shows big rise in unemployment, after composite PMI data shows UK business activity sunk to a record low in March following the Covid-19 lockdown" 
> parsedate::parse_date(txt) [1] "2020-03-19 UTC"
[1] "2020-03-19 UTC"
person sotnik    schedule 07.05.2020