在R中将日期格式转换为数字格式的问题

时间:2016-10-17 00:43:08

标签: r

我的数据集看起来像这样:

#df 

id       date
1       2016-08-30 10:46:46.810

我试图删除小时部分,只保留日期。这个功能起作用了:

df$date <-  format(as.POSIXct(strptime(df$date,"%Y-%m-%d %H:%M:%S")) ,format = "%Y-%m-%d")

现在的日期看起来像这个

id      date
1       2016-08-30

这是我正在寻找的东西。但问题是我希望对这些数据进行一些计算,并且必须将其转换为整数:

   temp <-  as.numeric(df$date )

它给了我以下警告:

Warning message:
NAs introduced by coercion 

并导致

NA

有谁知道问题出在哪里?

2 个答案:

答案 0 :(得分:4)

这很简单,因为你有一个标准格式(参见ISO 8601尤其 anytime包支持(并且它支持其他有些常规格式):< / p>

R> library(anytime)
R> at <- anytime("2016-08-30 10:46:46.810")
R> at
[1] "2016-08-30 10:46:46.80 CDT"
R> ad <- anydate("2016-08-30 10:46:46.810")
R> ad
[1] "2016-08-30"
R> 

但关键是理解基础日期格式之间的关系。你将不得不阅读并尝试更多。在这里,本质上我们只有

R> as.Date(anytime("2016-08-30 10:46:46.810"))
[1] "2016-08-30"
R> 

anytime包有一些其他技巧,例如从整数,字符,因子,有序,...自动转换。

至于你问题的第二部分,你如此接近,然后你再次使用format()破坏它,创建一个字符表示。

您几乎总是想要 Date 表示:

R> ad <- as.Date(anytime("2016-08-30 10:46:46.810"))
R> as.integer(ad)
[1] 17043
R> as.numeric(ad)
[1] 17043
R> ad + 1:3
[1] "2016-08-31" "2016-09-01" "2016-09-02"
R> 

答案 1 :(得分:1)

不是format()format为您提供了一个字符向量(字符串),这会使as.numeric混淆,因为那里有非常奇怪的非数字字符。就解析器而言,您可能也会问as.numeric("ripe red tomatoes")

请改用as.Date()。 e.g。

as.Date(as.POSIXct(df$date, format="%Y-%m-%d %H:%M:%S"))