R as.POSIXct() 下降小时分钟和秒
R as.POSIXct() dropping hours minutes and seconds
我正在尝试使用 R 来分析一些测量数据。我有一个包含超过 200 万行测量值的 .csv 文件。这是一个例子:
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分钟))
是什么导致了这种异常?是否由于某些系统限制,因为我 运行 在我的笔记本电脑上安装它。
编辑
在我的 Windows 7 设备上 I 运行 R 3.1.3 导致此错误。但是,在 Ubuntu 14.01、运行ning R 3.0.2 上,大文件的时间会保留。刚刚注意到 Windows 有更新的版本 (3.2.0),将更新并检查问题是否仍然存在。
也许您的问题的原因是您的数据集中某处有没有时间的日期。请尝试以下示例:
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)
然后您可以尝试将时间添加到所有具有 none 的日期,然后才转换为 POSIXct:
data$V1 <- ifelse(nchar(data$V1) > 11,data$V1, paste0(data$V1,"00:00:00"))
data$V1 <- as.POSIXct(data$V1)
这适用于我上面的小例子。这不是最优雅的解决方案,也许有人有更好的主意。
您可以试试下面的代码。
它将:
- 将日期时间类型读取为字符而不是因子
- 参考更新
library(data.table)
data <- fread("C:/RData/house2_electricity_main.csv")
data[, V1 := as.POSIXct(V1)]
最近有一个关于使用 fasttime::fastPOSIXct
而不是 as.POSIXct
的问题,后者可以额外加速。
至于标题问题,有POSIXct你可以很自由地四舍五入,例如函数 year
、month
、mday
...
data[, .SD, by = .(year(V1),month(V1),mday(V1))]
我有一个类似的问题 as.POSIXlt(X)
删除 hour:minute:second
信息,X
是 POSIXct
个对象的向量,恰好有 tzone="UTC"
.
但是,as.POSIXlt(X, tz="UTC")
保留了 hour:minute:second
信息。
我正在尝试使用 R 来分析一些测量数据。我有一个包含超过 200 万行测量值的 .csv 文件。这是一个例子:
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分钟))
是什么导致了这种异常?是否由于某些系统限制,因为我 运行 在我的笔记本电脑上安装它。
编辑
在我的 Windows 7 设备上 I 运行 R 3.1.3 导致此错误。但是,在 Ubuntu 14.01、运行ning R 3.0.2 上,大文件的时间会保留。刚刚注意到 Windows 有更新的版本 (3.2.0),将更新并检查问题是否仍然存在。
也许您的问题的原因是您的数据集中某处有没有时间的日期。请尝试以下示例:
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)
然后您可以尝试将时间添加到所有具有 none 的日期,然后才转换为 POSIXct:
data$V1 <- ifelse(nchar(data$V1) > 11,data$V1, paste0(data$V1,"00:00:00"))
data$V1 <- as.POSIXct(data$V1)
这适用于我上面的小例子。这不是最优雅的解决方案,也许有人有更好的主意。
您可以试试下面的代码。
它将:
- 将日期时间类型读取为字符而不是因子
- 参考更新
library(data.table)
data <- fread("C:/RData/house2_electricity_main.csv")
data[, V1 := as.POSIXct(V1)]
最近有一个关于使用 fasttime::fastPOSIXct
而不是 as.POSIXct
的问题,后者可以额外加速。
至于标题问题,有POSIXct你可以很自由地四舍五入,例如函数 year
、month
、mday
...
data[, .SD, by = .(year(V1),month(V1),mday(V1))]
我有一个类似的问题 as.POSIXlt(X)
删除 hour:minute:second
信息,X
是 POSIXct
个对象的向量,恰好有 tzone="UTC"
.
但是,as.POSIXlt(X, tz="UTC")
保留了 hour:minute:second
信息。