Каковы форматы «стандартной четкой даты»?

Пожалуйста, рассмотрите следующие

$ R --vanilla > as.Date("01 Jan 2000") Error in charToDate(x) : character string is not in a standard unambiguous format 

Но эта дата явно находится в стандартном недвусмысленном формате. Почему сообщение об ошибке?

Хуже того, двусмысленная дата, по-видимому, принимается без предупреждения или ошибки, а затем читается неправильно!

 > as.Date("01/01/2000") [1] "0001-01-20" 

Я искал и нашел еще 28 вопросов в теге [R], содержащих это сообщение об ошибке. Все с решениями и обходными решениями с указанием формата, iiuc. Этот вопрос отличается тем, что я спрашиваю, где все равно определены стандартные однозначные форматы, и можно ли их изменить? Получают ли все эти сообщения или это только я? Возможно, это связано с локалью?

Другими словами, есть ли лучшее решение, чем нужно указать формат?

29 вопросов, содержащих «стандартный однозначный формат» [R]

 > sessionInfo() R version 2.15.2 (2012-10-26) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=English_United Kingdom.1252 [2] LC_CTYPE=English_United Kingdom.1252 [3] LC_MONETARY=English_United Kingdom.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United Kingdom.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base 

Это документированное поведение. От ?as.Date :

format: Строка символов. Если он не указан, он попытается «% Y-% m-% d» ‘, а затем «% Y /% m /% d» на первом элементе, отличном от «NA », и сообщите об ошибке, если они не работают.

as.Date("01 Jan 2000") дает ошибку, потому что формат не является одним из двух перечисленных выше. as.Date("01/01/2000") дает неверный ответ, потому что дата не находится в одном из двух форматов, перечисленных выше.

Я считаю «стандартным однозначным» значение «ISO-8601» (хотя as.Date не так уж строг, так как «% m /% d /% Y» не ISO-8601).

Если вы получите эту ошибку, решение должно указать формат, в котором находится ваша дата (или дата), используя форматы, описанные в ?strptime . Обязательно используйте особую осторожность, если ваши данные содержат имена дня и месяца и / или аббревиатуры, поскольку преобразование будет зависеть от вашего языка (см. Примеры в « ?strptime и read ?LC_TIME ).

В качестве дополнения к ответу @JoshuaUlrich, вот определение функции as.Date.character :

 as.Date.character function (x, format = "", ...) { charToDate <- function(x) { xx <- x[1L] if (is.na(xx)) { j <- 1L while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j] if (is.na(xx)) f <- "%Y-%m-%d" } if (is.na(xx) || !is.na(strptime(xx, f <- "%Y-%m-%d", tz = "GMT")) || !is.na(strptime(xx, f <- "%Y/%m/%d", tz = "GMT"))) return(strptime(x, f)) stop("character string is not in a standard unambiguous format") } res <- if (missing(format)) charToDate(x) else strptime(x, format, tz = "GMT") as.Date(res) }   

Таким образом, в основном, если оба strptime(x, format="%Y-%m-%d") и strptime(x, format="%Y/%m/%d") выбрасывают NA это считается неоднозначным и если не однозначным ,

Другими словами, есть ли лучшее решение, чем нужно указать формат?

Да, сейчас (т.е. в конце 2016 года), благодаря anytime::anydate из пакета anytime .

Ниже приведено несколько примеров:

 R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10")) [1] "2000-01-01" "2000-01-01" "2015-10-10" R> 

Как вы сказали, это на самом деле однозначно и должно просто работать. И через anydate() они делают. Без формата.

Преобразование даты без указания текущего формата может легко привести к этой ошибке.

Вот пример:

 sdate <- "2015.10.10" 

Конвертировать без указания формата:

 date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""". 

Конвертировать с указанным форматом:

 date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion. 
  • Как выбрать строку с максимальным значением в каждой группе
  • Найдите, сколько раз повторяющиеся строки повторяются в кадре данных R
  • Как узнать R как язык программирования?
  • Преобразование десятичного в двоичный в R?
  • Проверить наличие директории и создать, если не существует
  • Почему я получаю «предупреждение, что длинная длина объекта не кратная короткой длине объекта»?
  • вытащить p-значения и r-квадрат из линейной регрессии
  • Использование '[' квадратная скобка как функция для lapply в R
  • Объедините (rbind) кадры данных и создайте столбец с именем исходных кадров данных
  • Слишком мало периодов для разложения ()
  • конвертировать письма в номера
  • Давайте будем гением компьютера.