Это проблема кодирования? - PullRequest
0 голосов
/ 05 декабря 2018

Я скачал текстовый файл, который содержит в основном два столбца - столбец даты и столбец содержимого.

Столбец даты изначально был в формате: mm/dd/yy h:mm:ss am/pm.Например, одна такая дата будет 10/16/2018 8:10:10 PM

Я хотел бы выделить обычную дату.Я разделил текстовый столбец с помощью команды strsplit(), и теперь у меня есть вектор с датами в общем формате mm/dd/yy.Я хочу преобразовать это, используя as.Date(x, format = '%m/%d/%y) комманду.

Тем не менее, я замечаю, что получаю хороший кусок моего вектора персонажа, выходящий как NA.Я сравнил значения NA со значениями, которые его окружают.Вот что я вижу:

normal_vector[1:3]
[1] "10/12/17" "‎10/12/17" "10/12/17"

** Средний (normal_vector[2]) является проблемным.**

as.Date(normal_vector[1:3], format = "%m/%d/%y")
[1]  "2017-10-12" NA           "2017-10-12"

Может ли это быть проблемой кодирования?Я пытаюсь использовать as.Date(iconv(normal_vector[1:3], to = "UTF-8"), format = "%m/%d/%y"), но это не помогает.Кроме того, если я проверяю кодировку векторов символов, как она есть, я получаю следующее:

Encoding(normal_vector[1:3])
[1] "unknown" "UTF-8"   "unknown"

Опять же, я просто хочу преобразовать все эти три элемента в обычный объект даты в R.Они кажутся идентичными, и кодировка заставила бы меня думать, что символ «UTF-8» будет легко обрабатываться функцией as.Date().Каковы некоторые возможные причины того, что он отказывается быть преобразованным в дату?

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

В вашей второй строке действительно есть какие-то странные символы (три «точки»), посмотрите на гекс e280 8e enter image description here

fread из data.table -пакет может читать этот текст просто отлично ...

data.table::fread("./temp.csv", header = FALSE)
#          V1          V2       V3
# 1: 10/12/17 ‎10/12/17 10/12/17

после прочтения вы можете очистить ваши данные с помощью некоторого регулярного выражения ...

dt <- data.table::fread("./temp.csv", header = FALSE)
#          V1          V2       V3
# 1: 10/12/17 ‎10/12/17 10/12/17

#strip all NON 0-9, a-z, A-z AND '/' -characters
cleaned <- as.character( gsub( "[^0-9a-zA-Z/]", "", as.matrix( dt ) ) )

as.Date( cleaned, format = "%m/%d/%y" )
# [1] "2017-10-12" "2017-10-12" "2017-10-12"
...