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

合并DataFrame两列日期至新列后格式变为数值,如何转为日期格式?

解决日期合并后变为数值格式的问题

我来帮你搞定这个问题——你遇到的其实是R中日期类型处理的一个常见小坑,咱们一步步理清楚:

首先,先指出你代码里的两个小问题:

  • 逻辑写反了:你写的ifelse(is.na(fech_A), fech_A, fech_B)意思是「如果fech_A是NA,就返回fech_A(还是NA),否则返回fech_B」,这和你想要的「取两列中非NA的日期」完全相反,应该改成ifelse(is.na(fech_A), fech_B, fech_A)——也就是fech_A非空就用fech_A,否则用fech_B。
  • 语法错误:代码最后少了一个闭合括号,运行时会直接报错。

为什么fech_C会变成数值?

在R里,Date类型本质是用整数存储的——这个整数代表从1970年1月1日开始计算的天数。而ifelse函数有个特性:它会自动把输入转换为最「基础」的数据类型,所以处理日期时,会把日期转成对应的整数数值返回,这就是你看到那些奇怪数字的原因。

两种解决方法

方法1:用dplyr::coalesce(推荐)

coalesce函数专门用来从多个列中取第一个非NA的值,而且会保留原始数据类型,完全不会出现转成数值的问题。另外还要注意:你原来的日期格式参数写错了,字符串是-分隔的,所以format要改成"%d-%m-%Y":

library(dplyr)

# 先创建正确的日期数据框
fech_A <- as.Date(c("8-02-06",NA,"9-03-14","9-03-05",NA), format = "%d-%m-%Y")
fech_B <- as.Date(c(NA,"8-11-18",NA,NA,"9-08-11"), format = "%d-%m-%Y")
calend1 <- data.frame(fech_A, fech_B)

# 生成fech_C
calend1 <- calend1 %>%
  mutate(fech_C = coalesce(fech_A, fech_B))

方法2:修复ifelse并转换回日期格式

如果你不想用dplyr,也可以把ifelse返回的数值重新转换为日期类型,只需要指定R日期的默认原点origin="1970-01-01":

# 修正ifelse逻辑并转换
fech_C <- with(calend1, ifelse(is.na(fech_A), fech_B, fech_A))
fech_C <- as.Date(fech_C, origin = "1970-01-01")

# 将fech_C加入数据框
calend1$fech_C <- fech_C

这样处理后,fech_C就会显示为正常的日期格式了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:17:39