使用dplyr和lubridate合并日期与小时创建datetime报错求助
解决dplyr+lubridate生成datetime时的POSIXlt报错问题
这问题我之前也碰到过,咱们一步步来拆解解决:
首先,先还原你的可运行数据:
library(tibble) tiny_date <- tibble( Element = rep("Sterlington 1", 7), Flowday = as.Date(c("2019-03-21", "2019-03-21", "2019-03-21", "2019-03-21", "2019-03-21", "2019-03-21", "2019-03-21")), Interval = c(1.00, 2.00, 3.00, 4.00, 22.0, 23.0, 24.0) )
报错原因
你原来的代码mutate(tiny_date, newdate = Flowday + hours(Interval - 1))之所以报错,是因为Date类型加上lubridate的Period对象后,会生成POSIXlt类型的结果,而dplyr不支持把POSIXlt作为数据框的列——因为POSIXlt是列表结构,不是标准的向量类型,所以被判定为"unsupported class"。
两种可行的解决方法
咱们的目标是生成POSIXct类型的datetime列(这是R中处理时间序列和绘图的标准类型,ggplot2等工具都完美支持):
方法一:先把Date转成POSIXct再做加法
先将Flowday转换成当天0点的POSIXct对象,再加上调整后的小时数,结果会保持POSIXct类型:
library(dplyr) library(lubridate) tiny_date_processed <- tiny_date %>% mutate( newdate = as.POSIXct(Flowday) + hours(Interval - 1) )
方法二:用ymd_h()直接构造datetime
把日期和调整后的小时数拼接成字符串,用lubridate的ymd_h()函数直接生成datetime,步骤更直观:
tiny_date_processed <- tiny_date %>% mutate( adjusted_hour = Interval - 1, # 处理24点的问题,转成前一小时 newdate = ymd_h(paste(Flowday, adjusted_hour)) )
验证结果
处理后你可以用class(tiny_date_processed$newdate)查看类型,会显示"POSIXct" "POSIXt",完全符合绘图需求。比如原数据中Interval=24.0的那条,会被转换成2019-03-21 23:00:00,完美解决24点不被识别的问题。
内容的提问来源于stack exchange,提问作者DavidH
相关产品推荐
相关产品推荐

