在R中将多字符列批量转为日期格式并去除时间的技术问询
批量转换所有字符列为日期格式(去除时间)的解决方案
我来帮你搞定这个批量转换日期列的问题!先梳理下你之前尝试遇到的问题,再给你几个高效的实现方法:
先修正你的示例数据
你用cbind得到的是矩阵,而dplyr操作的对象是数据框/tibble,所以第一步要把数据转成数据框:
library(dplyr) library(lubridate) col1 = c("2017-04-01 23:00:00", "2017-03-03 00:00:01", "2017-04-02 00:00:01") col2 = c("2017-04-10 08:41:49", "2017-04-10 08:39:48", "2017-04-10 08:41:51") df <- data.frame(col1, col2, stringsAsFactors = FALSE)
为什么你之前的方法失效?
- mutate用法错误:你写的
df %>% mutate(df, funs(ymd))存在两个问题:- 管道
%>%已经把df传给mutate了,不需要再写第一个参数df; - 你的字符串是带时间的,
ymd只能解析纯日期字符串,应该用ymd_hms来解析带时分秒的格式;另外新版dplyr已经不推荐funs(),改用lambda表达式~。
- 管道
- 循环没赋值:你写的循环只是调用了
as_date(df[i]),但没把转换后的值存回df里,自然看不到变化。
高效的批量转换方法
方法1:用mutate(across())(dplyr 1.0.0+ 推荐写法,最灵活)
across(everything())表示对所有列操作,先解析带时间的字符串,再用date()提取日期部分(自动去掉时间):
df <- df %>% mutate(across(everything(), ~ ymd_hms(.) %>% date()))
方法2:用mutate_all(旧版dplyr兼容写法)
如果你的dplyr版本较低,可以用mutate_all实现同样的批量操作:
df <- df %>% mutate_all(~ ymd_hms(.) %>% date())
方法3:灵活处理多种日期格式(如果你的列格式不统一)
如果有的列是mdy格式,有的是ymd,可以用parse_date_time自动识别:
df <- df %>% mutate(across(everything(), ~ parse_date_time(., orders = c("ymd_hms", "mdy_hms")) %>% date()))
方法4:修正后的循环写法
如果你偏好循环,只要把转换结果赋值回原列即可:
namedlist <- colnames(df) for(i in namedlist) { df[[i]] <- ymd_hms(df[[i]]) %>% date() }
验证结果
用glimpse(df)查看,所有列都会变成Date类型,且只有年月日,没有时间信息:
glimpse(df) # Rows: 3 # Columns: 2 # $ col1 <date> 2017-04-01, 2017-03-03, 2017-04-02 # $ col2 <date> 2017-04-10, 2017-04-10, 2017-04-10
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

