使用mutate+across+as_date(format='yyyymmdd')出现全NA值的问题排查
R语言中as_date指定format参数返回NA的问题解决
问题原因
你遇到的问题核心是**tibble::as_date函数的format参数用途和你理解的不一样**:
as_date的format参数不是用来解析日期字符串的,而是用于将已有的日期类型转换为指定格式的字符串输出。- 当你传入
format="yyyymmdd"时,函数会尝试把输入的"2023-01-02"这类ISO格式字符串,按照yyyymmdd的规则去解析,显然格式不匹配,所以全部返回NA。 - 不带参数的
as_date能正常工作,是因为它可以自动识别标准的YYYY-MM-DD格式字符串,直接转换为日期类型。
解决方法
如果需要按指定格式解析日期字符串,推荐用以下两种方式:
方式1:使用基础包as.Date指定解析格式
基础包的as.Date才是专门用于从字符串解析日期的函数,它的format参数用于定义输入字符串的格式。针对你的场景(输入是YYYY-MM-DD格式字符串),代码如下:
library(tidyverse) library(tis) holidays(2023) %>% data.frame() %>% set_names('holiday_date') %>% rownames_to_column() %>% pivot_wider(names_from = rowname,values_from = holiday_date) %>% mutate(across(everything(), as.character)) %>% mutate(across(everything(), ~as.Date(., format = "%Y-%m-%d")))
如果你的原始数据是yyyymmdd(如20230102)格式,只需把format改为"%Y%m%d"即可。
方式2:使用lubridate包的便捷解析函数(推荐)
lubridate包提供了一系列智能解析日期的函数,比如ymd,它能自动识别YYYY-MM-DD、YYYYMMDD等多种格式,无需手动指定format:
library(tidyverse) library(tis) library(lubridate) holidays(2023) %>% data.frame() %>% set_names('holiday_date') %>% rownames_to_column() %>% pivot_wider(names_from = rowname,values_from = holiday_date) %>% mutate(across(everything(), as.character)) %>% mutate(across(everything(), ymd))
额外说明:如果要输出指定格式的日期字符串
如果你是想把日期类型转换为yyyymmdd格式的字符串,而非解析日期,应该用format()函数配合as_date:
mutate(across(everything(), ~format(as_date(.), "%Y%m%d")))
这段代码会返回"20230102"这类字符串,而非日期类型。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

