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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:31:25