Проблема в том, что formats
в столбцах отличается от уже созданного. Итак, нам нужно что-то вроде
as.Date(df$Transaction, format = c("%d-%b-%Y", "%d-%m-%Y", "%d/%m/%Y"))
#[1] "2015-03-01" "2012-01-31" "1999-01-15"
, то есть formats
, указанное в OP, равно
formats
#[1] "%d-%m-%Y" "%d/%m/%Y" "%d-%b-%Y"
, если мы проверим столбец «Транзакция»
df$Transaction
#[1] 01-Mar-2015 31-01-2012 15/01/1999
Он включает %d-%m-%Y
и %d/%m/%Y
, который не найден в существующих форматах
Кроме того, для большей ясности переданный вектор format
выполняет поэлементное сравнение format
as.Date(df$Transaction, format = c("%d-%b-%Y", "%d/%m/%Y"))
#[1] "2015-03-01" NA NA
т.е., передавая "%d/%m/%Y"
, он должен был соответствовать третьей записи, но поскольку это поэлементное сравнение, он проверяет второй элемент, а затем выполняет повторную обработку вектора формат, поскольку он имеет длину меньше длины столбца «Транзакция»
Это означает, что если наш набор данных состоит из 1e6 строк, он ожидает форматы 1e6, которые должны соответствовать каждому элементу.
или используя anydate
из anytime
library(anytime)
addFormats(c('%d-%m-%Y', '%d/%m/%Y'))
df[] <- lapply(df, function(x) format(anydate(x), "%d-%b-%Y"))
df
# Transaction Delivery Return
#1 01-Mar-2015 01-Feb-2018 27-Nov-2009
#2 31-Jan-2012 01-Aug-2016 22-Jan-2013
#3 15-Jan-1999 17-Sep-2007 20-Nov-1987