使用as.Date时如何避免NA答案?

时间:2017-12-01 17:57:49

标签: r date date-formatting

我一直在尝试使用以下脚本将以下列转换为R中的yyyy - mm - dd数据对象,但没有成功。

它会创建一个NA列而不是它;也许是因为在每个值的开头和结尾都有单引号("'")。

我试图看起来像类似的帖子,但他们没有解决这个问题。

我该如何解决这个问题?

f8$Date
           [1] "'2016-01-05 08:44:10'" "'2016-01-05 08:45:51'" "'2016-01-05 08:45:54'" "'2016-01-05 08:46:24'" "'2016-01-05 08:46:24'"
           [6] "'2016-01-05 08:57:39'" "'2016-01-05 09:01:44'" "'2016-01-05 09:01:45'" "'2016-01-05 09:13:23'" "'2016-01-05 09:15:00'" ...

f8$Date <- as.Date(as.character(f8$Date), format = "%Y-%m-%d")

3 个答案:

答案 0 :(得分:2)

尝试将初始引号放入您的格式中,以便format = "'%Y-%m-%d"as.Date()会忘记字符串的其余部分,因为日期就在'之后。来自help(as.Date)

  

尽可能根据指定的格式处理字符串:忽略任何尾随字符。

所以我们有

as.Date("'2016-01-05 08:44:10'", format = "'%Y-%m-%d")
# [1] "2016-01-05"

答案 1 :(得分:2)

1)子串跳过前导'然后使用as.Date

as.Date(substring(dates, 2))
## [1] "2016-01-05" "2016-01-05" "2016-01-05" "2016-01-05" "2016-01-05"
## [6] "2016-01-05" "2016-01-05" "2016-01-05" "2016-01-05" "2016-01-05"

2)chartr 这也会起作用并给出相同的答案 - 它将每个单引号转换为空格然后应用as.Date

as.Date(chartr("'", " ", dates))

3)sub 这与(2)几乎相同,但使用sub代替chartr,只替换第一个',因为这已足够。它也用空字符串而不是空格替换它 - 要么工作。

as.Date(sub("'", "", dates))

4)扫描另一种方法是使用scan,如下所示:

as.Date(scan(text = dates, what = "", quiet = TRUE))

注意:假设输入dates为:

dates <- c("'2016-01-05 08:44:10'", "'2016-01-05 08:45:51'", "'2016-01-05 08:45:54'", 
"'2016-01-05 08:46:24'", "'2016-01-05 08:46:24'", "'2016-01-05 08:57:39'", 
"'2016-01-05 09:01:44'", "'2016-01-05 09:01:45'", "'2016-01-05 09:13:23'", 
"'2016-01-05 09:15:00'")

答案 2 :(得分:0)

您使用的任何In-build功能必须包含您提供输入的格式。一种方法可以如下所示。我已经创建了一个数据表,但您也可以使用数据框。最重要的部分是as.POSIXct(strptime(Time,'%Y-%d-%m %H:%M:%S')) - 如果您看到我们需要指定指定输入字符串的格式。

注意:双引号内的单引号没有意义,所以我已将其删除。

关于格式规范,您可以参考以下链接 - https://www.stat.berkeley.edu/~s133/dates.html

library(data.table)
Time=data.table(Time=c("2016-01-05 08:44:10","2016-01-05 08:45:51","2016-01-05 08:45:54","2016-01-05 08:46:24", "2016-01-05 08:46:24","2016-01-05 08:57:39","2016-01-05 09:01:44","2016-01-05 09:01:45","2016-01-05 09:13:23","2016-01-05 09:15:00")) 

Time[,Time_updated:=as.POSIXct(strptime(Time,'%Y-%d-%m %H:%M:%S'))]