【发布时间】:2017-09-02 15:14:24
【问题描述】:
我在 R 中有一个从 CSV 导入的数据框。 csv 中的“时间”格式为“%Y-%m-%d %H:%M:%S”,如下所示:
> head(btc_data)
time btc_price
1 2017-08-27 22:50:00 4,389.6113
2 2017-08-27 22:51:00 4,389.0850
3 2017-08-27 22:52:00 4,388.8625
4 2017-08-27 22:53:00 4,389.7888
5 2017-08-27 22:56:00 4,389.9138
6 2017-08-27 22:57:00 4,390.1663
当我运行str(btc_data) 时,时间列作为一个因素回来了。因此,我使用 lubridate 包将其转换为日期时间,如下所示:
btc_data$time <- ymd_hms(as.character(btc_data$time))
问题是在午夜收集的数据(5 行)无法解析并返回这样的 NA 值(在原始数据中,这些行中缺少时间戳,因此2017-08-29 00:00:00 被简单地列为2017-08-29) -
724 2017-08-28 23:59:00 4,439.3313
725 NA 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
此外,第二个数据框的组织方式不同:
> str(eth_data)
'data.frame': 1081 obs. of 2 variables:
$ time : Factor w/ 1081 levels "8/28/17 16:19",..: 1 2 3 4 5 6 7 8 9 10 ...
$ eth_price: num 344 344 344 344 343 ...
当我尝试时:
> eth_data$time <- mdy_hms(as.character(eth_data$time))
我收到以下错误:
警告消息:所有格式都无法解析。未找到格式。
编辑:我已隔离导致问题的代码问题:
> btc_data[721:726,]
time btc_price
721 2017-08-28 23:57:00 4,439.8163
722 2017-08-28 23:58:00 4,440.2363
723 2017-08-28 23:58:00 4,440.2363
724 2017-08-28 23:59:00 4,439.3313
725 2017-08-29 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
因此,每次午夜钟声敲响时,都不会记录时间戳。 CSV 是通过数据流创建的并且不断增长,因此除非我能找到解决方法,否则这个问题每天都会继续出现。有什么建议吗?
【问题讨论】:
-
请包括失败的行。
-
请看我的编辑——我添加了失败的行,第二个 df 完全失败了。
-
在 lubridate 有机会捣碎它之前,向我们展示 text。是 00:00:00 还是 24:00:00?
-
手动为这些元素添加时间:
with(df, ifelse(nchar(date) == 10, paste(date, "00:00:00"), date)),然后使用as.POSIXct进行转换 -
在此之前就行
btc_data$time <- as.character(btc_data$time)。下面的答案也显示了这种方法,只是用grep而不是nchar。