R as.POSIXct() 删除小时、分钟和秒

问题描述 投票:0回答:4

我正在尝试用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

读入文件后,我想使用

as.POSIXct()
将时间转换为正确的时间。对于小文件,这可以正常工作,但对于大文件,则不行。

我举了一个例子,读取一个大文件,创建一小部分的副本,然后在正确的列上释放

as.POSIXct()
。我包含了该文件的图像。正如您所看到的,当将其应用于
temp
变量时,它确实正确地保留了小时、分钟和秒。但是,当将其应用于整个文件时,仅存储日期。 (也需要很多时间(超过2分钟))

POSIXct() error

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

编辑

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

r posixct
4个回答
8
投票

也许你的问题的原因是你的数据集中有没有时间的日期。尝试以下示例:

  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)

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


5
投票

我也遇到了类似的问题,

as.POSIXlt(X)
删除了
hour:minute:second
信息,
X
POSIXct
对象的向量,恰好有
tzone="UTC"

但是,

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


3
投票

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

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

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))]

0
投票

当您的日期时间不存在时,可能会发生这种情况,因为(...叹息...)夏令时。例如,在山地时间(美国),2022-03-13 02:45:00 不存在

    # All datetimes exist:
    my.dates <- as.character(c("2022-02-12 12:34:56",
                               "2022-05-12 08:30:00"))
    
    as.POSIXct(my.dates)
    [1] "2022-02-12 12:34:56" "2022-05-12 08:30:00"
    
    # One datetime doesn't exist:
    my.dates <- as.character(c("2022-02-12 12:34:56",
                               "2022-03-13 02:45:00",
                               "2022-05-12 08:30:00"))
    
    as.POSIXct(my.dates)
    [1] "2022-02-12 MST" "2022-03-13 MST" "2022-05-12 MDT"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.