我的数据集看起来像这样:
#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
有谁知道问题出在哪里?
答案 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"))