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

如何用readr的read_csv()读取含多种日期格式的单列数据?

用readr直接解析多格式日期列的方案

readr原生的col_date()仅支持单一日期格式,但可以通过自定义列解析函数实现类似lubridate::parse_date_time()的多格式解析功能,无需先将列读取为字符串再后续转换。

实现方法

通过col_parse()传入封装了parse_date()的自定义函数,让parse_date()尝试多种格式解析日期:

library(tidyverse)

# 定义支持多格式的日期解析列类型
col_date_multi <- function(formats = c("%Y-%m-%d", "%d/%m/%Y")) {
  col_parse(function(x) parse_date(x, format = formats))
}

# 示例数据
df <- r'(
    id,date
    1,2023-01-01
    2,1/1/2023
)'

# 读取数据时使用自定义列类型
col_spec <- cols(
  id = col_character(),
  date = col_date_multi()
)

read_csv(df, col_types = col_spec)

运行结果:

# A tibble: 2 x 2
  id    date      
  <chr> <date>    
1 1     2023-01-01
2 2     2023-01-01

简化写法(无需自定义函数)

也可以直接在cols()中使用匿名函数,省去单独定义函数的步骤:

col_spec <- cols(
  id = col_character(),
  date = col_parse(function(x) parse_date(x, format = c("%Y-%m-%d", "%d/%m/%Y")))
)

read_csv(df, col_types = col_spec)

注意事项

  • parse_date()会按照format参数的顺序尝试解析,遇到匹配的格式就停止。如果存在歧义格式(如1/2/2023可能被解析为日/月/年或月/日/年),需要调整格式顺序以匹配你的数据逻辑。
  • 可以根据实际需求扩展formats参数的内容,比如添加%m/%d/%Y等其他格式。

内容的提问来源于stack exchange,提问作者joshbrows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:18:33