这是编码问题吗?

时间:2018-12-05 07:28:54

标签: r encoding character-encoding iconv as.date

我下载了一个文本文件,该文件基本上包含两列-日期列和内容列。

日期列最初的格式为: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) coommand进行转换。

但是,我注意到我的字符向量中有很大一部分以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中的普通日期对象。它们看起来是相同的,并且编码使我认为{{{ 1}}函数。拒绝将其转换为日期的可能原因有哪些?

谢谢!

1 个答案:

答案 0 :(得分:1)

第二个字符串中确实有一些奇怪的字符(三个“点”) 看看十六进制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"