Замена текста переменной структуры датой - PullRequest
1 голос
/ 11 июля 2020

У меня есть следующие данные:

df <- data.frame(dt.str = c("X2019.12.31.23.59.5", "X2020.01.31.23.59.59", "X2020.02.29.23.59.59", "X30.04.2020.23.59", "X30.04.2020.23.59", "X30.06.2020.23.59"), value = c(4, 3.42,2.96,7.26,3.35,2.986))

Я хотел бы преобразовать dt.str на сегодняшний день.

df <- df %>% mutate (dt.str.2 = as.Date(str_extract(dt.str, "[^X]+$"), format= "%Y.%m.%d.%H.%M"))

Однако это решение не работает (по понятным причинам) в последних трех случаях.

Ответы [ 4 ]

2 голосов
/ 11 июля 2020

Решение на основе пакета lubridate:

library(lubridate)
df$dt.str.2 <- format(parse_date_time(sub("^X(.{10}).*$","\\1",df$dt.str), 
                                      orders = c("%Y.%m.%d", "%d.%m.%Y")), "%Y.%m.%d")

df
                dt.str value   dt.str.2
1  X2019.12.31.23.59.5 4.000 2019.12.31
2 X2020.01.31.23.59.59 3.420 2020.01.31
3 X2020.02.29.23.59.59 2.960 2020.02.29
4    X30.04.2020.23.59 7.260 2020.04.30
5    X30.04.2020.23.59 3.350 2020.04.30
6    X30.06.2020.23.59 2.986 2020.06.30

В dplyr:

library(lubridate)
library(dplyr)
df <- df %>% 
  mutate (dt.str.2 = format(parse_date_time(sub("^X(.{10}).*$","\\1",dt.str), 
                                            orders = c("%Y.%m.%d", "%d.%m.%Y")), "%Y.%m.%d"))
2 голосов
/ 11 июля 2020

Вы можете использовать parse_date_time из lubridate после удаления «X» в начале строки.

library(lubridate)
as.Date(parse_date_time(sub('^X', '', df$dt.str), c('YmdHMS', 'dmyHM')))
#[1] "2019-12-31" "2020-01-31" "2020-02-29" "2020-04-30" "2020-04-30" "2020-06-30"
1 голос
/ 11 июля 2020

Вы можете попробовать if_else:

df = df %>% mutate (dt.str.2 = if_else(
nchar(str_extract(string =df$dt.str,pattern = '(?<=X)\\d*(?=.)'))==4,
true = as.Date(str_extract(dt.str, "[^X]+$"), format= "%Y.%m.%d.%H.%M.%S"),
false =as.Date(str_extract(dt.str, "[^X]+$"), format= "%d.%m.%Y.%H.%M")))
                dt.str value   dt.str.2
1  X2019.12.31.23.59.5 4.000 2019-12-31
2 X2020.01.31.23.59.59 3.420 2020-01-31
3 X2020.02.29.23.59.59 2.960 2020-02-29
4    X30.04.2020.23.59 7.260 2020-04-30
5    X30.04.2020.23.59 3.350 2020-04-30
6    X30.06.2020.23.59 2.986 2020-06-30

Если у вас есть более двух шаблонов дат в данных, вы можете продолжать добавлять if_else() вызовов в параметр false.

0 голосов
/ 11 июля 2020

Мы можем использовать anytime из anytime

library(lubridate)
library(anytime)
library(dplyr)
library(stringr)
addFormats("%d.%m.%Y.%H.%M")
df %>% 
    mutate(dt.str.2 = as_date(anytime(str_remove(dt.str, "^X"))))
#                dt.str value   dt.str.2
#1  X2019.12.31.23.59.5 4.000 2019-12-31
#2 X2020.01.31.23.59.59 3.420 2020-01-31
#3 X2020.02.29.23.59.59 2.960 2020-02-29
#4    X30.04.2020.23.59 7.260 2020-04-30
#5    X30.04.2020.23.59 3.350 2020-04-30
#6    X30.06.2020.23.59 2.986 2020-06-30
...