R as.POSIXct()下降小时分和秒

jde*_*ere 4 r posixct

我正在试验R来分析一些测量数据.我有一个.csv文件,包含超过200万行测量.这是一个例子:

2014-10-22 21:07:03+00:00,7432442.0
2014-10-22 21:07:21+00:00,7432443.0
2014-10-22 21:07:39+00:00,7432444.0
2014-10-22 21:07:57+00:00,7432445.0
2014-10-22 21:08:15+00:00,7432446.0
2014-10-22 21:08:33+00:00,7432447.0
2014-10-22 21:08:52+00:00,7432448.0
2014-10-22 21:09:10+00:00,7432449.0
2014-10-22 21:09:28+00:00,7432450.0
Run Code Online (Sandbox Code Playgroud)

在读入文件后,我想将时间转换为正确的时间,使用as.POSIXct().对于小文件,这可以正常工作,但对于大文件则不行.

我通过读取一个大文件,创建一个小部分的副本然后释放as.POSIXct()正确的列来做一个例子.我包含了该文件的图像.正如您所看到的,当将它应用于temp-variable时,它会纠正小时,分钟和秒.但是,将其应用于整个文件时,仅存储日期.(也需要很多时间(超过2分钟))

POSIXct()错误

什么可能导致这种异常?这是由于某些系统限制,因为我在我的笔记本电脑上运行它.

编辑

在我的Windows 7设备上运行R 3.1.3会导致此错误.但是,在运行R 3.0.2的Ubuntu 14.01上,保留了大文件的时间.刚刚注意到有一个适用于Windows的更新版本(3.2.0),将更新并检查问题是否仍然存在.

Sti*_*ibu 7

也许你的问题的原因是你的数据集中的某个地方没有时间.请尝试以下示例:

  library(lubridate)
  dates <- as.character(now() + minutes(1:5))
  dates <- c(dates,"2015-05-10")
  as.POSIXct(dates[1:5])
  as.POSIXct(dates)
Run Code Online (Sandbox Code Playgroud)

它首先创建一个dates包含6个日期和时间的向量,并将它们转换为字符.然后我添加另一个不包含时间的日期(作为一个字符).当您运行两次转换时POSIXct,只要您没有时间包含日期,您就会注意到结果中的时间已经消失.

因此,在您的数据的前几行中似乎没有时间没有时间,但稍后可能会有.对于这个问题,很可能有很多解决方案,我只想提出一个我想到的问题.

第一步是更改读取命令,以便将日期存储为字符而不是因子:

data <- read.csv("C:/RData/house2_electricity_Main.csv",header=FALSE,stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

然后,您可以尝试将时间添加到所有没有的日期,然后仅转换为POSIXct:

data$V1 <- ifelse(nchar(data$V1) > 11,data$V1, paste0(data$V1,"00:00:00"))
data$V1 <- as.POSIXct(data$V1)
Run Code Online (Sandbox Code Playgroud)

这适用于我上面的小例子.它不是最优雅的解决方案,也许有人有更好的主意.


小智 5

我在as.POSIXlt(X)删除hour:minute:second信息时遇到了类似的问题,因为X它是POSIXct对象的向量,碰巧有tzone="UTC".

但是,as.POSIXlt(X, tz="UTC")保留了hour:minute:second信息。


jan*_*cki 3

您可以尝试下面的代码。
它会:

  • 将日期时间类型读取为字符而不是因子
  • 通过参考更新

library(data.table)
data <- fread("C:/RData/house2_electricity_main.csv")
data[, V1 := as.POSIXct(V1)]
Run Code Online (Sandbox Code Playgroud)

最近有一个问题是关于使用代替fasttime::fastPOSIXctas.POSIXct可以进一步加快速度。

至于标题问题,有了 POSIXct,你就可以很自由地四舍五入,例如函数year,,month...mday

data[, .SD, by = .(year(V1),month(V1),mday(V1))]
Run Code Online (Sandbox Code Playgroud)

  • @jangorecki 事实证明,[Stibu 的答案](http://stackoverflow.com/questions/30038701/r-as-posixct-dropping-hours-minutes-and-seconds/30039313#30039313) 是我的解决方案!值号 19705 是一个没有“时间”组件的日期值..:-/ (2认同)