Загадочная ошибка при анализе французских дат в OSX
У меня есть вектор символов с датами на французском языке. Я хотел бы преобразовать их в формат даты в R. Кажется, что это работает, но есть некоторые загадочные ошибки. Например, R признает "30 июня 2012 года", но не "30 juillet 2012":
> as.Date("30 juin 2012", format = "%d %B %Y")
[1] "2012-06-30"
> as.Date("28 février 2012", format = "%d %B %Y")
[1] "2012-02-28"
> as.Date("30 juillet 2012", format = "%d %B %Y")
[1] NA
Есть ли у вас какие-либо объяснения?
PS: моя локальная настройка - французский UTF8
> Sys.getlocale()
[1] "fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8"
Ответы
Ответ 1
У меня нет объяснений, но у меня есть решение. Имея аналогичные проблемы с немецкими номерами, используя "," вместо ".". для десятичных знаков и некоторых других способов написания дат. Вот что я обычно делаю с моими данными, которые находятся не в правильном формате:
a<-"30 juillet 2012"
b<-gsub(pattern="juillet", a, replacement="july")
as.Date(b, format="%d %B %Y")
[1] "2012-07-30"
Надеюсь, это поможет вам. Если "july" не работает в вашей системе, вы всегда можете заменить его на 7. Так
a<-"30 juillet 2012"
b<-gsub(pattern="juillet", a, replacement="/ 7 /")
b<-gsub(pattern="|| ", b, replacement="")
as.Date(b, format= "%d/%m/%Y")
Приветствия, Бен
Ответ 2
Как сказал GSee, это проблема локали. Установите языковой стандарт на французский язык с помощью Sys.setlocale
, и пример кода будет работать нормально.
В Linux (я думаю, OS X тоже, но не протестирован):
Sys.setlocale(locale="fr_FR")
В Windows:
Sys.setlocale(locale="French_France")
Комментарий UTF-8
в GSee - это кодировка символов и не является обязательным. См. ?iconvlist
для получения дополнительной информации.
Ответ 3
(Ответ на "почему?" и "как ответ" уже отправлен. Таким образом, это оставит это как то, что кажется "глубоким" объяснением, даже если это не патч на OSX. ошибка в OSX, а не R.)
Несмотря на то, что моя локаль (также на Mac) установлена на "fr_FR", настройка LC_TIME остается "en_US"
> Sys.getlocale()
[1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
> Sys.setlocale(locale="fr_FR") # Should have category="LC_ALL"
[1] "fr_FR/fr_FR/fr_FR/C/fr_FR/en_US.UTF-8"
> month.abb
[1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> month.name
[1] "January" "February" "March" "April" "May" "June" "July"
[8] "August" "September" "October" "November" "December"
После прочтения ошибки Github для lubridate, похоже, я не сообщаю ничего нового. Думаю, у Мак есть эта ошибка. Страницы помощи говорят, что значения "month.abb" и "month.name" должны использоваться как ссылки, но их изменение также неэффективно. (Возможно, они читаются в Startup?) Сообщается о SIG-R-Mac: http://markmail.org/search/?q=+list%3Aorg.r-project.r-sig-mac+french+locale#query:%20list%3Aorg.r-project.r-sig-mac%20french%20locale+page:1+mid:oie7r5qksadmzjia+state:results
И затем, читая далее, мы видим, что ошибка находится в OSX и была там в течение некоторого времени:
http://lists.freebsd.org/pipermail/freebsd-bugs/2009-December/037796.html
Я только на льве, но буду обновляться до Маверикса "сейчас скоро".
Ответ 4
Некоторые поисковые запросы на "OSX strptime juillet" вызывают этот комментарий от Peter Dalgaard http://grokbase.com/t/r/r-sig-mac/12696r26eh/as-date-does-not-work-with-format-b:
Похоже, что это
http://lists.freebsd.org/pipermail/freebsd-bugs/2009-December/037796.html
который был зафиксирован в мае 2010 года, но, по-видимому, не обновления OSX пока отсутствуют. (Все еще там, в местном построении на Льве, так что не только CRAN. Вставьте соответствующую информацию о Open Source и коммерческие продавцы здесь...)
Резюме ошибки: strptime с% B проходит через месяцы и проверки для полного имени, затем аббревиатуры. Проблема в том, что "jui" из "juillet" совпадения abbr. для "juin"! но "llet" не соответствует% Y, и мы получаем NA.
Итак, это ошибка BSD, которая сохраняется в OSX.
Похоже, вам придется использовать что-то вроде решения @Ben K, чтобы обойти это. (К сожалению.)