2015-05-04 29 views
3

我正在试验R来分析一些测量数据。我有一个包含200多万行测量值的.csv文件。这里有一个例子:R as.POSIXct()下降小时分秒

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 

文件中读取后,我想将时间转化为正确的时间,用as.POSIXct()。对于小文件,这可以正常工作,但对于大文件则不会。

我做了一个例子,通过阅读一个大文件,创建一小部分的副本,然后在正确的列上释放as.POSIXct()。我包含了该文件的图像。正如你所看到的,当它应用于temp时,它可以正确保持小时,分钟和秒钟。但是,将其应用于整个文件时,只会存储日期。 (它也需要大量的时间(超过2分钟))

POSIXct() error

这是什么原因anomality?是否由于某些系统限制,因为我正在笔记本上运行此操作。

编辑

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

+1

我无法用您提供的数据重现问题。你可以找到一个最低限度[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)?另外,您使用的是哪个版本的R以及哪个操作系统? – MrFlick

回答

3

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

  • 读取时间类型的字符,而不是因素
  • 更新通过参考

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

有一个问题,最近关于fasttime::fastPOSIXct使用替代as.POSIXct可以加速。

至于标题问题,有POSIXct你可以很自由地围绕它,例如,功能yearmonthmday ...

data[, .SD, by = .(year(V1),month(V1),mday(V1))] 
+0

恐怕这似乎没有解决问题,时间仍然是下降... – jdepypere

+0

@ jdepypere你有没有使用比列出的其他较低级别的舍入函数* year,month,mday *? – jangorecki

+0

没有任何四舍五入功能(只有你的第一个代码块),当我打印出一个完整的条目时,时间会被丢弃。 – jdepypere

7

也许你的问题的原因是你的日期没有时间在你的数据集中的某个地方。尝试下面的例子:

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

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

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

的第一步是改变你读命令,这样的日期存储为字符,而不是因素:你可以尝试将时间添加到有没有和转换所有的日期

data <- read.csv("C:/RData/house2_electricity_Main.csv",header=FALSE,stringsAsFactors=FALSE) 

然后到POSIXct只有之后:

data$V1 <- ifelse(nchar(data$V1) > 11,data$V1, paste0(data$V1,"00:00:00")) 
data$V1 <- as.POSIXct(data$V1) 

这对我上面的小示例工作。这不是最优雅的解决方案,也许有人有更好的主意。

2

我有as.POSIXlt(X)丢弃hour:minute:second信息,与XPOSIXct物体的向量类似的问题,那正巧有tzone="UTC"

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