You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

为什么你之前的方法失效?

  1. mutate用法错误:你写的df %>% mutate(df, funs(ymd))存在两个问题:
    • 管道%>%已经把df传给mutate了,不需要再写第一个参数df;
    • 你的字符串是带时间的,ymd只能解析纯日期字符串,应该用ymd_hms来解析带时分秒的格式;另外新版dplyr已经不推荐funs(),改用lambda表达式~。
  2. 循环没赋值:你写的循环只是调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:54:59