如何将RequisitionHistory2中因子型时间列拆分为日期和时间列并转datetime?
解决方法:拆分并转换日期时间列
首先咱们来拆解下你遇到的问题:
- 你误把整个数据框
RequisitionHistory2传给了as.POSIXct(),但这个函数需要的是单个列向量(也就是你的RequisitionDateTime列),这是报错的核心原因。 - 你的格式字符串也存在错误:
"%m/%d/%. %H:%M %p"里的%.是无效写法,应该用%Y匹配年份;另外你的时间是24小时制(比如14:16),完全不需要%p(这个参数是用来识别AM/PM标识的)。
下面给你两种可行的解决方案,都能完美实现拆分日期和时间的需求:
方法1:用dplyr + 基础R函数实现
library(dplyr) RequisitionHistory2 <- RequisitionHistory2 %>% # 先将因子型列转为字符,再转换为标准POSIXct格式 mutate(RequisitionDateTime = as.POSIXct(as.character(RequisitionDateTime), format = "%m/%d/%Y %H:%M")) %>% # 拆分出日期列和时间列 mutate(RequisitionDate = as.Date(RequisitionDateTime), # 若需要字符型时间,用strftime;若想保留时间格式,用format也可以 RequisitionTime = strftime(RequisitionDateTime, format = "%H:%M"))
方法2:用lubridate包简化操作(更推荐)
lubridate对日期时间的处理非常智能,能自动识别多数常用格式:
library(dplyr) library(lubridate) RequisitionHistory2 <- RequisitionHistory2 %>% # 快速将因子型日期时间转为标准datetime类型 mutate(RequisitionDateTime = mdy_hm(as.character(RequisitionDateTime))) %>% # 拆分日期和时间 mutate(RequisitionDate = date(RequisitionDateTime), # 生成专用的时间类型列,若要字符型仍可用strftime RequisitionTime = hms::hms(second(RequisitionDateTime), minute(RequisitionDateTime), hour(RequisitionDateTime)))
额外提示
- 因为你的
RequisitionDateTime是因子型,必须先转成字符型再做日期转换,否则容易出现数值匹配错误。 - 如果转换后仍有问题,可以先检查
RequisitionDateTime列的所有值是否都符合%m/%d/%Y %H:%M的格式,排查是否存在异常值。
内容的提问来源于stack exchange,提问作者Boardozzer
相关产品推荐
相关产品推荐

