在R语言中拆分日期时间列为单独的日期列和时间列
R语言拆分「Date and Time」列为Date和Time列的解决方案
问题分析
你之前的代码失败主要有两个原因:
- 错误引用了
Time列(原列名为「Date and Time」) - 没有先将完整的日期时间字符串解析为标准时间对象,直接拆分时间部分导致格式不匹配
下面提供两种适合入门者的实现方法,均会保留原「Date and Time」列,同时生成目标的Date和Time列。
准备示例数据
先构造和你数据结构一致的测试数据,方便验证:
data <- data.frame( `Date and Time` = c( "10/28/2023 11:00:00 PM", "9/22/2023 11:47:00 AM", "9/22/2023 11:47:00 AM", "8/24/2023 11:58:00 AM" ), stringsAsFactors = FALSE )
方法一:使用tidyverse工具(推荐)
借助dplyr和lubridate包,语法更直观,适合数据处理场景:
# 先加载所需包(如果未安装,先运行 install.packages(c("dplyr", "lubridate"))) library(dplyr) library(lubridate) data_processed <- data %>% # 解析完整日期时间字符串为标准时间对象 mutate(datetime = mdy_hms(`Date and Time`)) %>% # 提取日期部分,生成Date列(Date类型,支持日期筛选) mutate(Date = as.Date(datetime)) %>% # 提取12小时制带AM/PM的时间字符串,生成Time列 mutate(Time = format(datetime, "%I:%M:%S %p"))
如果不需要中间的datetime列,可以添加select(-datetime)删除它;若需要做时间间隔运算,建议保留datetime列(它是可运算的POSIXct类型)。
方法二:基础R实现(无需额外安装包)
用基础R函数完成,适合不想安装额外包的场景:
# 解析完整日期时间字符串为POSIXlt时间对象 data$datetime <- strptime(data$`Date and Time`, format = "%m/%d/%Y %I:%M:%S %p") # 提取日期部分生成Date列 data$Date <- as.Date(data$datetime) # 提取12小时制带AM/PM的时间字符串生成Time列 data$Time <- format(data$datetime, "%I:%M:%S %p") # 可选:删除中间的datetime列 # data$datetime <- NULL
关键说明
- 两种方法均会保留原「Date and Time」列,不会修改原始数据
- Date列是
Date类型,支持直接按日期范围筛选(如filter(data_processed, Date >= as.Date("2023-09-01"))) - 若要进行时间间隔运算,建议使用保留的
datetime列(POSIX类型),字符型的Time列无法直接做算术操作
内容的提问来源于stack exchange,提问作者cake2244
相关产品推荐
相关产品推荐

