Как я могу читать даты без года, используя readr?

У меня есть файл данных, в котором указаны даты без года.

01/05   Fellowship enters Moria
01/09   Fellowship reaches Lorien
01/17   Passing of Gandalf
02/07   Fellowship leaves Lorien
02/17   Death of Boromir

Я пытаюсь прочитать это так

lotr <- read_tsv(lotr_file,
                 skip = 9,
                 col_names = c("date", "event"),
                 col_types = cols(
                    date = col_date(format = "%m/%d"),
                    event = col_character()))

но кажется, что синтаксический анализатор readr не может анализировать даты без года. С другой стороны, lubridate может обрабатывать такие даты:

> parse_date_time("12-15", "%m-%d")
[1] "0000-12-15 UTC"

Есть ли способ, которым readr может читать такие даты или может использовать lubridate?

Если readr не может обработать такие "даты" или день года, я бы использовал dplyr следующим образом:

lotr <- read_tsv(lotr_file,
                 skip = 9,
                 n_max = 37,
                 col_names = c("day_of_year", "event"),
                 col_types = cols(
                   day_of_year = col_character(),
                   event = col_character())) %>% 
   mutate(date = parse_date(paste0("2016/",day_of_year))) %>% 
   select(date, event)

1 ответ

Как указал Рич в комментариях, "дата" без года недопустима, так как вам нужен год, месяц и дата.

Подобные вопросы возникали раньше, и ответ заключается в том, чтобы просто добавить значение отсутствующего типа, будь то день за месяцем или год, или здесь год за днем ​​и месяц.

См. Например

R> vals <- c("01/05", "01/09", "01/17", "02/07", "02/17")  # values
R> yval <- paste0("2000/", vals)  # prefix a year 
R> anytime::anydate(yval)    # needs no format
[1] "2000-01-05" "2000-01-09" "2000-01-17" "2000-02-07" "2000-02-17"
R> 

То, что они у вас есть, вы можете отформатировать, или вычислить различия, или... Два примера:

R> diff(anytime::anydate(yval))
Time differences in days
[1]  4  8 21 10
R> format(anytime::anydate(yval), "%d-%b")
[1] "05-Jan" "09-Jan" "17-Jan" "07-Feb" "17-Feb"
R> 
Другие вопросы по тегам