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

У меня есть фрейм данных, который содержит столбец вызова «дата».Однако форматы даты заметно отличаются.Тип данных - строка.Я пытаюсь создать столбцы «месяц», «год» и «день недели» из этого столбца данных.

dataid     date
1         Tue 11/3
2         Wed 11/4 
3          N/A
4         Monday, February 1, 2016
5         Thursday, March 25, 2015 

Каков наилучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Надежный способ - использовать lubridate::parse_date_time(), но эти даты без года могут быть неверно проанализированы (вам может потребоваться отредактировать их вручную).

Вы можете прочитать "help (" strptime ")" дляузнайте больше о том, как форматировать заказы для разбора вашей даты.

ps 25 марта 2015 года - среда, а не четверг, как в данных вашего примера.

library(dplyr)

library(lubridate)


df <- data.table::fread(
"dataid     date
1         'Tue 11/3'
2         'Wed 11/4' 
3         'N/A'
4         'Monday, February 1, 2016'
5         'Thursday, March 25, 2015'
",quote="\'")

df.new <- df %>%
  mutate(
    date2 =lubridate::parse_date_time(x =date, orders = c("%a %m/%d", "%A, %B %d, %Y"))
  )
#> Warning: 1 failed to parse.


df.new
#>   dataid                     date      date2
#> 1      1                 Tue 11/3 2018-11-03
#> 2      2                 Wed 11/4 2018-11-04
#> 3      3                      N/A       <NA>
#> 4      4 Monday, February 1, 2016 2016-02-01
#> 5      5 Thursday, March 25, 2015 2015-03-25

Создано в 2018-10-08 пакетом представ (v0.2.1)

оттуда вы можете извлечь год, месяц, день недели следующим образом:

df.new %>%
  mutate(
    year = lubridate::year(date2),
    month = lubridate::month(date2),
    day_of_week = weekdays(date2)
  )

  #  dataid                     date      date2 year month day_of_week
  #1      1                 Tue 11/3 2018-11-03 2018    11    Saturday
  #2      2                 Wed 11/4 2018-11-04 2018    11      Sunday
  #3      3                      N/A       <NA>   NA    NA        <NA>
  #4      4 Monday, February 1, 2016 2016-02-01 2016     2      Monday
  #5      5 Thursday, March 25, 2015 2015-03-25 2015     3   Wednesday
0 голосов
/ 08 октября 2018

Если день и месяц записаны в виде символов, то при вызове dplyr::case_when() можно использовать регулярные выражения:

library(dplyr)

df <- df %>%
  mutate(
    day_of_the_week = case_when(
      grepl("mon", date, ignore.case = T) ~ "mon",
      grepl("tue", date, ignore.case = T) ~ "tues",
      grepl("wed", date, ignore.case = T) ~ "wed",
      grepl("thu", date, ignore.case = T) ~ "thurs",
      grepl("fri", date, ignore.case = T) ~ "fri",
      grepl("sat", date, ignore.case = T) ~ "sat",
      grepl("sun", date, ignore.case = T) ~ "sun",
      T ~ NA_character_
    ),
    month = case_when(
      grepl("jan", date, ignore.case = T) ~ "jan",
      grepl("feb", date, ignore.case = T) ~ "feb",
      grepl("mar", date, ignore.case = T) ~ "mar",
      grepl("apr", date, ignore.case = T) ~ "apr",
      grepl("may", date, ignore.case = T) ~ "may",
      grepl("jun", date, ignore.case = T) ~ "jun",
      grepl("jul", date, ignore.case = T) ~ "jul",
      grepl("aug", date, ignore.case = T) ~ "aug",
      grepl("sep", date, ignore.case = T) ~ "sep",
      grepl("oct", date, ignore.case = T) ~ "oct",
      grepl("nov", date, ignore.case = T) ~ "nov",
      grepl("dec", date, ignore.case = T) ~ "dec",
      T ~ NA_character_
    )
  )

#   dataid                     date day_of_the_week month
# 1      1                 Tue 11/3            tues  <NA>
# 2      2                 Wed 11/4             wed  <NA>
# 3      3                     <NA>            <NA>  <NA>
# 4      4 Monday, February 1, 2016             mon   feb
# 5      5 Thursday, March 25, 2015           thurs   mar

Выделить номер дня / месяца сложнее (вы могли быаналогичным образом для дней месяца между 13 и 31, но в противном случае невозможно узнать, является ли число днем ​​или месяцем.)

Данные

df <- read.table(text = "
dataid     date
1         'Tue 11/3'
2         'Wed 11/4'
3         N/A
4         'Monday, February 1, 2016'
5         'Thursday, March 25, 2015'",
                 header = T,
                 stringsAsFactors = F,
                 na.strings = "N/A")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...