R语言:将字符型datetime列拆分为日期列与hms格式时间列
字符型日期时间拆分:Date列 + HMS时间列解决方案
针对你的chr类型日期列start_at(格式为dd/mm/yyyy HH:MM),以下是可靠的拆分方法,同时满足start_date为Date格式、start_Time为hms格式(自动补00秒)的要求:
基础R实现
1. 日期列优化
你之前的日期处理可以简化,无需嵌套format,直接指定格式转换即可:
# 修正:统一变量名为start_at(注意你代码里有笔误写成started_at) november$start_date <- as.Date(november$start_at, format = "%d/%m/%Y")
2. 时间列处理
核心是先正确解析完整的日期时间字符串为POSIXct对象,再提取时间转成hms格式:
# 加载hms包(若未安装先运行install.packages("hms")) library(hms) # 解析完整日期时间,指定正确格式 datetime_full <- as.POSIXct(november$start_at, format = "%d/%m/%Y %H:%M") # 提取时间并转为hms格式,自动补00秒 november$start_Time <- hms(format(datetime_full, "%H:%M:%S"))
Tidyverse + Lubridate 简洁方案
用lubridate的解析函数更高效,适合批量处理:
# 安装依赖包(首次运行) install.packages(c("tidyverse", "lubridate", "hms")) library(tidyverse) library(lubridate) library(hms) november <- november %>% mutate( # 解析为datetime对象(dmy_hm对应dd/mm/yyyy HH:MM格式) datetime = dmy_hm(start_at), # 提取日期列 start_date = as.Date(datetime), # 提取时间并转为hms格式 start_Time = as_hms(datetime) ) %>% # 可选:移除中间生成的datetime列 select(-datetime)
验证结果
运行以下代码检查格式是否符合要求:
# 检查日期列 str(november$start_date) # 输出示例:Date[1:337735], format: "2022-11-01" "2022-11-01" ... # 检查时间列 str(november$start_Time) # 输出示例:'hms' num 00:00:00 00:00:00 00:01:00 06:43:00 ... # - attr(*, "units")= chr "secs"
原代码出错原因
as.POSIXct(november$started_at)未指定format参数,R默认解析规则无法识别你的dd/mm/yyyy HH:MM格式,导致时间解析失败,返回全00:00:00parse_date_time(november$started_at,"dmy")仅指定了日期解析规则(dmy),未包含时间部分(hm),无法解析带时间的字符串,因此返回全NA
内容的提问来源于stack exchange,提问作者Nabeel
相关产品推荐
相关产品推荐

