Как указать день и месяц для грязных данных с пропущенными днем ​​и месяцем при конвертации в дату в большом фрейме данных - PullRequest
0 голосов
/ 12 июня 2018

У меня большой фрейм с датой более 100 тысяч строк.Столбец даты содержит даты в нескольких форматах, таких как "%m/%d/%Y", "%Y-%m", "%Y" и "%Y-%m-%d".Я могу преобразовать все это в даты с parse_date_time() из lubridate.

dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17")

parse_date_time(dates, orders = c("%m/%d/%Y","%Y-%m","%Y","%Y-%m-%d"))

[1] "1983-05-10 UTC" "2014-08-17 UTC" "1953-12-01 UTC" "1975-01-01 UTC" "2001-06-17 UTC"

Но, как вы можете видеть, это устанавливает даты с пропущенным днем ​​в первый месяц и даты с пропущенным месяцем и днемк первому году.Как я могу установить их на 15 и 15 июня соответственно?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вот еще один способ сделать это - на основе orders:

library(lubridate)
dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17")

parseDates <- function(x, orders = c('mdY', 'dmY', 'Ymd', 'Y', 'Ym')){
  fmts <- guess_formats(x, orders = orders)
  dte <- parse_date_time(x, orders = fmts[1], tz = 'UTC')
  if(!grepl('m', fmts[1]) ){
    dte <- dte + days(165)
    return(dte)
  }
  if(!grepl('d', fmts[1]) ){
    dte <- dte + days(14)
  }
  return(dte)
}

вывод

> parseDates(dates[4])
[1] "1975-06-15 UTC"
> parseDates(dates[3])
[1] "1953-12-15 UTC"

Этот способ для разных форматов даты вам нужен толькоизменить аргумент orders, в то время как все остальное делается с помощью lubridate.

Надеюсь, это полезно!

0 голосов
/ 12 июня 2018

Используйте nchar для проверки вектора дат и paste того, что отсутствует.

library(lubridate)

dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17")


dates <- ifelse(nchar(dates) == 4, paste(dates, "06-15", sep = "-"),
             ifelse(nchar(dates) == 7, paste(dates, 15, sep = "-"), dates))
dates
#[1] "05/10/1983" "8/17/2014"  "1953-12-15" "1975-06-15"
#[5] "2001-06-17"

parse_date_time(dates, orders = c("%m/%d/%Y","%Y-%m","%Y","%Y-%m-%d"))
#[1] "1983-05-10 UTC" "2014-08-17 UTC" "1953-12-15 UTC"
#[4] "1975-06-15 UTC" "2001-06-17 UTC"

Другим решением будет использование вектора индекса, также основанного на nchar.

n <- nchar(dates)
dates[n == 4] <- paste(dates[n == 4], "06-15", sep = "-")
dates[n == 7] <- paste(dates[n == 7], "15", sep = "-")

dates
#[1] "05/10/1983" "8/17/2014"  "1953-12-15" "1975-06-15"
#[5] "2001-06-17"

Как видите, результат такой же, как с ifelse.

...